将循环语句改为for时有问题
来源:5-1 Leetcode中和链表相关的问题
XLL_XOI
2022-08-28
老师,请问能将虚拟头结点的循环语句改为for循环吗?
for(ListNode prev = dummyHead; prev.next != null ; prev = prev.next){
if(prev.next.val == val){
ListNode delNode = prev.next;
prev.next = delNode.next;
delNode.next = null;
}
}
提交到Leetcode上会报错,我自己用IDEA测试了,当链表结尾为6的时候[1,2,3,6,5,6],会报错。其他结尾时就不会。
写回答
1回答
-
你的这个 for 循环的逻辑和我课程中的 while 循环逻辑不等价。
课程中的这个 while 循环:
while(prev.next != null){ if(prev.next.val == val) prev.next = prev.next.next; else prev = prev.next; }
在 prev.next.val == val 的时候,做了删除操作,但是 prev 没有往后移;
只有在 prev.next.val != val 的时候,prev 才后移(执行 prev = prev.next)
但是你的 for 循环,无论什么情况,prev 都后移。所以是错误的。想想为什么?
改成这样即可:
class Solution { public ListNode removeElements(ListNode head, int val) { ListNode dummyHead = new ListNode(-1); dummyHead.next = head; for(ListNode prev = dummyHead; prev.next != null ; ){ if(prev.next.val == val){ ListNode delNode = prev.next; prev.next = delNode.next; delNode.next = null; } else prev = prev.next; } return dummyHead.next; } }
继续加油!:)
012022-08-29
相似问题