关于链表删除元素的问题

来源: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回答

liuyubobobo

2019-03-30

你的逻辑没有问题的,你的测试方法不对。


removeElements是有返回值的,返回的是执行删除以后链表的头结点。你要看最后删除的结果,要看返回值的链表是什么。


所以,main的最后两行应该是这样的:

ListNode res = (new Solution3()).removeElements(head, val);
System.out.println(res);


继续加油!:)

0
1
qq_往事_8
非常感谢!
2019-03-30
共1条回复

玩转数据结构

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

6221 学习 · 1704 问题

查看课程