比如下面这个定义 class ListNode: def init(self, val=0, next=None): self.val = val self.next = next
遇到一个特别头疼的问题是,p.next 在代码中可能有歧义(或者是我理解不到位):
结果我连一个交换链表节点都做不好.......
1
Jirajine 2020-11-18 13:58:50 +08:00 via Android
有类型在,没有歧义。
p 是 ListNode[T],p.val 是 T 。 p.next 是 ListNode[T],p.next.val 是 T 。 |
2
Trim21 2020-11-18 13:58:59 +08:00 via Android
不应该是具体内容啊,如果是具体内容,你怎么访问下一个节点的下一个节点呢。
想修改下一个节点的内容应该修改 p.next.val |
3
Hstar 2020-11-18 14:04:35 +08:00
什么玩意?建议重修
|
4
renmu123 2020-11-18 14:07:31 +08:00 via Android
p.next=p.next.next
|
5
binxin OP @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 不是一个含义。 所以我是哪里理解错了呢? |
6
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 在链表中已经没有了。
|
7
maocat 2020-11-18 14:50:38 +08:00
p.next = p.next.next if p.next else None
|
8
JeffGe 2020-11-18 14:59:08 +08:00 via Android
Python 没有指针的概念,Python 所有变量都是对被右值的引用
|
10
binxin OP @maocat
我说下我的理解: 1. Python 没有指针的概念,Python 所有变量都是对被右值的引用意味着:p1.next=p2 中的 p1.next 其实是指 p2 这个 node,或者说 p1.next 是 p2 的引用? 2. 那么在 p1.next = p3 的时候,其实不是把 p1 的 next 属性改成了 p3,而是把 p2 这个 node 改成了 p3,所以我哪里还是理解错了是么? |
11
iConnect 2020-11-18 16:22:51 +08:00 via Android
只是使用的话,建议去 github 上找现成的各种链表实现,久经考验的轮子比自己写靠谱的多。如果不能满足需求,自己写或者研究用途另说
|
13
JeffGe 2020-11-18 18:55:48 +08:00 via Android
|
14
geebos 2020-11-18 18:59:13 +08:00 via Android
理解成引用就好了,不要把 next 理解成对象,事实上 next 确实是引用而不是指针
|