关于链表中的引用

来源:5-2 测试自己的Leetcode链表代码

慕神7448648

2020-07-09

class Solution3 {

    public ListNode removeElements(ListNode head, int val) {

        ListNode dummyHead = new ListNode(-1);
        dummyHead.next = head;

        ListNode prev = dummyHead;
        while(prev.next != null){
            if(prev.next.val == val)
                prev.next = prev.next.next;
            else
                prev = prev.next;
        }

        return dummyHead.next;
    }
}

老师你好:
请教一下这里的引用怎么理解?首先创建了dummyHead 这个引用指向了虚拟头节点。ListNode prev = dummyHead;这个代码我理解的意思是将引用prev和引用dummyHead都指向了虚拟头节点。之后遍历链表的时候使用的是引用prev。prev = prev.next;这个代码将引用prev给覆盖了,这时候引用prev和引用dummyHead所指向的对象应该是不同的。为什么最后的返回时dummyHead.next,而在程序中操作的却是引用prev?

写回答

2回答

qq_XR_1

2021-11-16

因为 dummyHead.next 始终指向链表的头结点,而 prev 在 return 的时候,指针已经指向了链表的尾结点。你需要返回的是从头结点开始遍历的一整个链表,所以得返回 dummyHead.next,同时用 prev 来操作。

0
0

liuyubobobo

2020-07-09

你前面所有的描述都是正确的,我没有理解你的疑问点。因为 dummyHead 一直指向的是链表的第一个节点。


或者说,你觉得应该返回谁?

0
4
liuyubobobo
回复
慕神7448648
额。。。我还是没有理解你的问题,因为你的描述中没有任何矛盾点。比如你理解的 dummyHead.next 是怎么变的?这个理解和你的程序实验哪里产生了不相符,所以导致了你的疑问?实际上只要链表的第一个元素没有被删除,dummyHead.next 就不会变。对于 dummy->1->2->3->4->null 这个链表,如果我们删除 3,就变成 dummy->1->2->4。dummyHead 和 dummyHead 完全没有变。但如果我们删除 1,链表变成了 dummy->2->3->4。dummyHead.next 会变成 2,但这是 prev 指针的作用。使用这个例子,实际运行一下程序,看看在一个具体的例子中,程序中的各个变量,比如 prev 和 dummyHead 都指向谁?在程序运行过程中,这些变量都是怎么改变的?最终如何获得了最终的结果?
2020-07-10
共4条回复

玩转数据结构

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

6221 学习 · 1704 问题

查看课程