请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于链表中的引用

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?

18078
收起

正在回答 回答被采纳积分+3

2回答

qq_XR_1 2021-11-16 11:21:42

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

0 回复 有任何疑惑可以回复我~
liuyubobobo 2020-07-09 14:40:06

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


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

0 回复 有任何疑惑可以回复我~
  • 提问者 慕神7448648 #1
    我的疑问就是引用 prev 和引用 dummyHead 之间的关系;在开始时它两都是指向 head 节点的 但是在程序处理过程中引用 prev 是会被后面的节点覆盖的,而引用 dummyHead 是没有变化的。我可能哪一块没理解,希望老师解答一下,谢谢!
    回复 有任何疑惑可以回复我~ 2020-07-09 14:58:06
  • liuyubobobo 回复 提问者 慕神7448648 #2
    我还是没有理解你的问题。因为你的描述都是正确的。prev 和 dummyHead 没有关系,是两个独立的引用。 prev 从 dummyHead 开始往后找待删除节点的前一个节点,在不断变化;dummyHead 一直在原地,指着链表的第一个节点。
    回复 有任何疑惑可以回复我~ 2020-07-09 14:59:44
  • 提问者 慕神7448648 回复 liuyubobobo #3
    老师,简单点说,我就是不知道这个dummyHead.next是怎么变化的?你也说了prev 和 dummyHead 没有关系,是两个独立的引用,程序里操作的只是prev 。
    回复 有任何疑惑可以回复我~ 2020-07-09 17:27:31
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信