【问题标题】:Explanation about dummy nodes and pointers in linked lists链表中虚拟节点和指针的说明
【发布时间】:2020-03-02 02:15:45
【问题描述】:

我有以下用于列表节点的类:

    def __init__(self, x):
        self.val = x
        self.next = None

如果我初始化列表 lr 如下:

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

两个列表都将l 放在第二个节点位置,但是当我设置时

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 pointers linked-list


    【解决方案1】:

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

    dummy = cur = ListNode(0)
    # cur = 0
    # dummy = 0
    

    dummycur 都指向同一个对象(即同一个单元素列表)。当您将其他列表附加到 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 is None 的那个)。

    【讨论】:

    • 这很有帮助!但是当我们做cur.next=r时,为什么r在dummy的列表的第三个元素处插入,而在cur的列表的第二个元素处插入?
    • 因为它仍然是同一个列表,但cur 指向dummy 前面的一个节点。如果这些是数组,则类似于cur == dummy[1:]
    • 学习链表的一般建议:画很多方框和指针图。 :) 从 Python 方面理解的关键是,当您调用 ListNode 构造函数时,您正在创建一个新框,而当您为 next 分配值时,您正在绘制(或移动)一个指针。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-28
    • 2012-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多