为什么此ListNode的值在Python中不更改?

时间:2019-09-12 02:45:39

标签: python

通过给出排序的链接列表,删除所有重复项,以使每个元素仅出现一次。(链接:https://leetcode.com/problems/remove-duplicates-from-sorted-list/) 我已经有了解决方案,但是我对下面的其他解决方案感到困惑。

class Solution(object):
    def deleteDuplicates(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        curr = head
        prev = ListNode(0)
        # prev.next = curr
        rec = prev
        while curr:
            while curr.next and curr.val == curr.next.val:
                curr = curr.next
            prev.next = curr
            print('prev1:',prev)
            prev = curr
            print('prev2:',prev )
            curr = curr.next
            print('rec  :',rec)
        return rec.next

输入:

[1,1,2,3,3]

输出:

[1,2,3]

打印:

prev1: ListNode{val: 0, next: ListNode{val: 1, next: ListNode{val: 2, next: ListNode{val: 3, next: ListNode{val: 3, next: None}}}}}
prev2: ListNode{val: 1, next: ListNode{val: 2, next: ListNode{val: 3, next: ListNode{val: 3, next: None}}}}
rec  : ListNode{val: 0, next: ListNode{val: 1, next: ListNode{val: 2, next: ListNode{val: 3, next: ListNode{val: 3, next: None}}}}}

问题1:为什么recprev2在这里不一样?

prev1: ListNode{val: 1, next: ListNode{val: 2, next: ListNode{val: 3, next: ListNode{val: 3, next: None}}}}
prev2: ListNode{val: 2, next: ListNode{val: 3, next: ListNode{val: 3, next: None}}}
rec  : ListNode{val: 0, next: ListNode{val: 1, next: ListNode{val: 2, next: ListNode{val: 3, next: ListNode{val: 3, next: None}}}}}
prev1: ListNode{val: 2, next: ListNode{val: 3, next: None}}
prev2: ListNode{val: 3, next: None}
rec  : ListNode{val: 0, next: ListNode{val: 1, next: ListNode{val: 2, next: ListNode{val: 3, next: None}}}}

问题2:为什么rec在这里ListNode{val: 0, next: ListNode{val: 1, next: ListNode{val: 2, next: ListNode{val: 3, next: None}}}}

1 个答案:

答案 0 :(得分:0)

您首先构造prevprev = ListNode(0)

然后您将rec指向它:rec = prev,因此rec现在指向一个具有值0的新节点。

currhead开始,因为它已传递到函数中,并且循环从列表curr开始向前移动head,直到到达最后一个结点为止。仍具有当前值,与head的值匹配。

然后将.next的{​​{1}}(因此,prev的它是同一节点)指向rec

curr然后更新为指向prev(值curr),但是1仍指向值rec的同一节点。 / p>

0然后更新为指向curr(值curr.next)并重复该过程。

这回答了您的第一个问题:2rec指向的节点不同,这是作为prev的值打印出来的。

随着该过程的继续,在每个具有重复值的最后一个节点中进行链接,并跳过所有具有相同值的先前节点,最后得到prev2:指向值{{ 1}}(已初始化),并且运行中所有具有唯一值的节点从rec开始。

这回答了您的第二个问题-出于与问题1相同的原因,它以0开头,而其余的正是您所期望的,如果您意识到具有值{{1 }}是所构建链的起点。