Python 链表的歧义问题求助

2020-11-18 13:55:47 +08:00
 binxin

比如下面这个定义 class ListNode: def init(self, val=0, next=None): self.val = val self.next = next

遇到一个特别头疼的问题是,p.next 在代码中可能有歧义(或者是我理解不到位):

  1. 它可能是指 p 这个 ListNode 的 self.next,偶尔我想修改它
  2. 它可能是指 p 这个 ListNode 的下一个节点(具体内容)

结果我连一个交换链表节点都做不好.......

1076 次点击
所在节点    问与答
14 条回复
Jirajine
2020-11-18 13:58:50 +08:00
有类型在,没有歧义。
p 是 ListNode[T],p.val 是 T 。
p.next 是 ListNode[T],p.next.val 是 T 。
Trim21
2020-11-18 13:58:59 +08:00
不应该是具体内容啊,如果是具体内容,你怎么访问下一个节点的下一个节点呢。
想修改下一个节点的内容应该修改 p.next.val
Hstar
2020-11-18 14:04:35 +08:00
什么玩意?建议重修
renmu123
2020-11-18 14:07:31 +08:00
p.next=p.next.next
binxin
2020-11-18 14:27:54 +08:00
@renmu123
嗯嗯,就比如这位老师的例子:p.next=p.next.next,
等号右边是 p.next.next,那么它的前半部分,p.next 应该是指 p 这个节点的 next 指针,但是 p 这个节点的 next 指针是没有 next 属性的,得它指向的对象才有 next,也就是等号右边的 p.next.next 中的“p.next”,其实代表的是 p 的下一个节点整体内容,这个和左边的 p.next 不是一个含义。

所以我是哪里理解错了呢?
renmu123
2020-11-18 14:41:51 +08:00
@binxin #5 p1=Node(1), p2=Node(2), p3=Node(3) p1.next=p2 p2.next=p3 。 这时候链表就是:p1=>p2=>p3 。这时候 p1.next.next=p3 。如果 p1.next=p3,那么现在链表就是 p1=>p3 。p2 在链表中已经没有了。
maocat
2020-11-18 14:50:38 +08:00
p.next = p.next.next if p.next else None
JeffGe
2020-11-18 14:59:08 +08:00
Python 没有指针的概念,Python 所有变量都是对被右值的引用
JeffGe
2020-11-18 14:59:39 +08:00
@JeffGe 多打了个“被”
binxin
2020-11-18 16:14:23 +08:00
@maocat
我说下我的理解:
1. Python 没有指针的概念,Python 所有变量都是对被右值的引用意味着:p1.next=p2 中的 p1.next 其实是指 p2 这个 node,或者说 p1.next 是 p2 的引用?
2. 那么在 p1.next = p3 的时候,其实不是把 p1 的 next 属性改成了 p3,而是把 p2 这个 node 改成了 p3,所以我哪里还是理解错了是么?
iConnect
2020-11-18 16:22:51 +08:00
只是使用的话,建议去 github 上找现成的各种链表实现,久经考验的轮子比自己写靠谱的多。如果不能满足需求,自己写或者研究用途另说
binxin
2020-11-18 16:28:19 +08:00
@iConnect
LC 第 24 、25 题卡壳中。。。。
JeffGe
2020-11-18 18:55:48 +08:00
geebos
2020-11-18 18:59:13 +08:00
理解成引用就好了,不要把 next 理解成对象,事实上 next 确实是引用而不是指针

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/726678

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX