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
赋值时,您正在绘制(或移动)指针。