查看: 3020| 回复: 9
跳转到指定楼层
上一主题 下一主题
收起左侧

[树/链表/图] 关于链表题dummy head的问题。

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
一般我们setup 一个dummy node。 dummy.next = head. 然后做一些操作。最后return dummy.next。
比如这一题。 https://leetcode.com/problems/insertion-sort-list/
答案 https://leetcode.com/problems/in ... -clear-way-to-sort-(-O(1)-space-)

我的问题是,为什么 helper.next是新链表的头? helper是跟着pre改变,比如4-2-1. pre最后会指向1,helper也跟着指向1. 但是4-2-1-3, pre最后会指向3,为什么helper还能指向1???

链表有好多这样的例子,我一直没弄明白。望指教。

上一篇:老话题了,一个二分搜索模版 to rule it all
下一篇:几道变态的SQL面试题
推荐
zea7ot 2020-9-7 09:05:47 | 只看该作者
全局:
本帖最后由 zea7ot 于 2020-9-7 09:16 编辑

一家之言:
需要创建dummyHead的一般有两个情况:
1. head节点有可能被删除,或者新创建。比如去重的题目,如果发现重复就要全部去除;比如新创建链表的时候(奇偶链表那道)。
2. head作为cursor需要指导后面的操作的时候。这种情况也可能可以通过创建新的cursor指针得到解决。
简而言之,就是头结点不确定的时候,往往需要dummyHead节点。

使用prev作为cursor(指的是对prev.next节点进行操作),相比较cur作为cursor(指的是对current节点进行操作),会有更多的灵活性,因为可以直接删除。

评分

参与人数 1大米 +1 收起 理由
xuesong + 1 给你点个赞!

查看全部评分

回复

使用道具 举报

推荐
BobbyBear 2020-9-7 09:58:57 | 只看该作者
全局:
ftr好好学习 发表于 2020-9-7 07:03
这里的pre是dummy的一份copy啊,只是初始和dummy指向一个地址,但两者是独立的。看C++那种有指针的语言写出 ...

正解。举个简单的例子

  1. cur = head;
  2. prev = cur;
  3. cur = cur.next;
复制代码


这段运行以后pre会指向head, 而cur指向head.next。prev = cur只是把cur在那个状态下的reference复制给pre,以后cur怎么变并不会影响pre。
回复

使用道具 举报

🔗
 楼主| xydotguy 2020-9-7 06:54:57 | 只看该作者
全局:
答案链接打不开, 截了个图在这里。

image.png (33.72 KB, 下载次数: 2)

image.png
回复

使用道具 举报

全局:
这里的pre是dummy的一份copy啊,只是初始和dummy指向一个地址,但两者是独立的。看C++那种有指针的语言写出来的链表代码,可以帮助理解
回复

使用道具 举报

🔗
 楼主| xydotguy 2020-9-7 08:41:03 | 只看该作者
全局:
ftr好好学习 发表于 2020-9-7 07:03
这里的pre是dummy的一份copy啊,只是初始和dummy指向一个地址,但两者是独立的。看C++那种有指针的语言写出 ...

独立的话,最后return的dummy.next为什么能指向最新的node? 在dummy被定义以后,没有任何code去update dummy.next.
回复

使用道具 举报

🔗
 楼主| xydotguy 2020-9-7 09:03:46 | 只看该作者
全局:
这是C++版本,明显dummy.next指向了head。上面Java版本确没有

image.png (29.67 KB, 下载次数: 2)

image.png
回复

使用道具 举报

🔗
niuhj 2020-9-7 12:56:19 | 只看该作者
全局:
本帖最后由 niuhj 于 2020-9-7 13:15 编辑

helper和pre最开始是一样的,然后pre指向某个新的head,helper也同时指向那个head了,然后pre变了,变成pre=pre.next,这个时候helper并没有变,也就是pre和helper这时候不指向相同节点了,pre无法改变helper了。也就是pre往后遍历了,helper还是指向那个head。循环的最后,pre=helper,相当于pre又重置到了helper,这时候pre又和helper一样了,也就是pre改变helper也会改变,那么新的循环中pre下一次变化又会使helper指向新的head,但是仅此而已,helper没有往后遍历,只是helper指向的节点变了,自己没变,也就是helper永远指向每次循环中的head。但是pre =pre.next之后,pre就和helper不一样了,这时pre的改变就不会改变helper。所以helper实际就是每次循环pre=helper的时候 pre的改变会改变helper的next,pre=pre.next之后helper就和pre没关系了,所以helper可以永远指向最新的head。结论:pre=helper的时候,pre会改变helper,但是pre=pre.next之后,pre就不会改变helper了;而helper一直没变,只是每次循环被动的被pre改变了next。
回复

使用道具 举报

🔗
anderson1234 2020-9-10 13:24:25 | 只看该作者
全局:
楼上都很好
回复

使用道具 举报

全局:
变量被重新赋值了 所以pre不再是原来的dummy那个node
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表