关于链表删除元素的问题
来源:5-1 Leetcode中和链表相关的问题
qq_往事_8
2019-03-29
public class Solution3 {
public ListNode removeElements(ListNode head, int val) {
//首先需要判断第一个元素是否为val,同时也需要判断head是否为空
while (head!=null&&head.val==val){
//进行删除
//将head设置为待删除的节点
ListNode delNode = head;
//将head向后移动一位
head = head.next;
//将delNode与链表断开
delNode.next = null;
}
//如果链表中全是需要删除的元素时,链表就是空的
if (head==null){
//返回空
return null;
}
//如果链表的中间有val
//需要从头开始向后移动,设置prev
ListNode prev = head;
//如果prev的下一个不为空,进行循环
while (prev.next!=null){
//如果prev的下一个值等于val,就进行删除
if (prev.next.val==val){
//创建待删除的节点
ListNode delNode = prev.next;
//将prev.next指向retNode.next,相当于跳过了delNode
prev.next = delNode.next;
//将retNode与链表断开
delNode.next = null;
}else {
//如果不相同就将prev向后移动
prev = prev.next;
}
}
//条件不满足时,返回head
return head;
}
public static void main(String[] args) {
int[] arr = {1,1};
int val = 1;
ListNode head = new ListNode(arr);
System.out.println(head);
(new Solution3()).removeElements(head, val);
System.out.println(head);
}
}
老师,为什么如果在数组中输入两个相同的数,在while循环中不能全部删掉,我按照视频中的代码对比了while循环中的内容,没有差别呀
写回答
1回答
-
你的逻辑没有问题的,你的测试方法不对。
removeElements是有返回值的,返回的是执行删除以后链表的头结点。你要看最后删除的结果,要看返回值的链表是什么。
所以,main的最后两行应该是这样的:
ListNode res = (new Solution3()).removeElements(head, val); System.out.println(res);
继续加油!:)
012019-03-30
相似问题