对节点感到困惑

时间:2016-03-13 22:00:21

标签: python linked-list

def absorb_value(lnk, value):
    """ (LinkedList, int) -> NoneType
    >>> lnk = LinkedList()
    >>> lnk.append(6)
    >>> lnk.append(7)
    >>> lnk.append(8)
    >>> lnk.append(7)
    >>> print(lnk.front)
    6 -> 7 -> 8 -> 7 ->|
    >>> absorb_value(lnk, 7)
    >>> print(lnk.front)
    6 -> 15 -> 7 ->|
    >>> absorb_value(lnk, 6)
    >>> print(lnk.front)
    21 -> 7 ->|
    """
    if lnk.front:
        prev_node, cur_node = None, lnk.front
        while cur_node and not cur_node.value == value:
            prev_node = cur_node
            cur_node = cur_node.next_
        if cur_node and cur_node.next_:
            cur_node.next_.value += value
            if prev_node:
                prev_node.next_ = cur_node.next_
            else:
                lnk.front = cur_node.next_
            lnk.size -= 1
        else:
            pass
    else:
        pass

我有一个解决方案,我理解大部分代码,但不知道它是如何改变原始链接的。

 prev_node.next_ = cur_node.next_

我不明白这段代码是如何运作的,没有关于lnk的代码,但为什么lnk可以被它改变?

1 个答案:

答案 0 :(得分:0)

您在问题结尾处引用的行会将cur_node从链接列表中删除。它不需要直接修改lnk,因为会有一串其他链接指向prev_node lnk,因此对列表的更改将是可见的。

我注意到整个prev_node业务对我来说似乎没有必要。修改cur_node.value并从列表中删除cur_node.next_会更容易,而不是在修改cur_node后删除cur_node.next_.value。 (也许还有一些我认为没有考虑的问题?最后的pass语句应该被一些额外的代码替换吗?)