将循环语句改为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回答

liuyubobobo

2022-08-28

你的这个 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;
    }
}


继续加油!:)

0
1
XLL_XOI
谢谢老师
2022-08-29
共1条回复

玩转数据结构

动态数组/栈/队列/链表/BST/堆/线段树/Trie/并查集/AVL/红黑树…

6221 学习 · 1704 问题

查看课程