Python 关于链表中伪节点和指针的说明

Python 关于链表中伪节点和指针的说明,python,pointers,linked-list,Python,Pointers,Linked List,对于列表节点,我有以下类: def __init__(self, x): self.val = x self.next = None 如果我初始化列表l和r,如下所示: l = ListNode(1) l.next = ListNode(4) l.next.next = ListNode(5) r = ListNode(1) r.next = ListNode(3) r.next.next = ListNode(4) # l: 1->4->

对于列表节点,我有以下类:

    def __init__(self, x):
        self.val = x
        self.next = None
如果我初始化列表
l
r
,如下所示:

l = ListNode(1)
l.next = ListNode(4)
l.next.next = ListNode(5)

r = ListNode(1)
r.next = ListNode(3)
r.next.next = ListNode(4)

# l: 1->4->5
# r: 1->3->4
虚拟/当前节点为

dummy = cur = ListNode(0)
# cur = 0
# dummy = 0
当我设定

cur.next = l
# cur = 0->1->4->5
# dummy = 0->1->4->5
cur = cur.next
# cur = 1->4->5
# dummy = 0->1->4->5
两个列表都将
l
放在第二个节点位置,但当我设置

cur.next = l
# cur = 0->1->4->5
# dummy = 0->1->4->5
cur = cur.next
# cur = 1->4->5
# dummy = 0->1->4->5
只有
cur
列表丢失第一个节点。然后当我开始

cur.next = r
# cur = 1->1->3->4
# dummy = 0->1->1->3->4
cur
列表将
r
列表附加在第二个位置,而
dummy
列表将其附加在第三个位置。我认为
dummy
看起来像
0->1->3->4


我想这是我在python中的指针或一般的链表中缺少的东西。任何解释都将不胜感激

这里的关键是,当您将Python变量设置为对象时,它是指针,而不是值。在这段代码中:

dummy = cur = ListNode(0)
# cur = 0
# dummy = 0
dummy
cur
都指向相同的对象(即相同的单个元素列表)。当您将另一个列表附加到
cur
时,您同时将它附加到
dummy
,因为它是同一个列表

执行此操作时:

cur = cur.next
# cur = 1->4->5
# dummy = 0->1->4->5
您不是在创建新列表,而是在现有列表下迭代
cur
指针。两个指针都是同一列表的一部分,但
dummy
指向第一个元素,而
cur
指向第二个元素

每次调用
ListNode()
都是在创建一个新节点,因此如果要创建两个具有相同值的节点,则需要调用初始值设定项两次:

dummy = ListNode(0)
cur = ListNode(0)
# cur and dummy both have values of 0, but they're different list objects!


另外:我不确定这是否是您在提到“虚拟节点”时的意思,但请注意,您的列表中没有特别需要一个特殊的“虚拟节点”来表示列表的结束
None
为这个目的服务得很好(即列表的末尾是其
next为None
)。

这很有帮助!但是,当我们执行
cur.next=r
时,为什么在
dummy
的列表的第三个元素中插入r,而在
cur
的列表的第二个元素中插入r?因为它仍然是相同的列表,但是
cur
指向
dummy
前面的一个节点。如果这些是数组,则类似于
cur==dummy[1://code>。学习链表的一般建议:绘制大量方框图和指针图。:)从Python方面需要理解的关键是,当您调用
ListNode
构造函数时,您正在创建一个新框,当您为
next
赋值时,您正在绘制(或移动)指针。