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
可以被它改变?
答案 0 :(得分:0)
您在问题结尾处引用的行会将cur_node
从链接列表中删除。它不需要直接修改lnk
,因为会有一串其他链接指向prev_node
lnk
,因此对列表的更改将是可见的。
我注意到整个prev_node
业务对我来说似乎没有必要。修改cur_node.value
并从列表中删除cur_node.next_
会更容易,而不是在修改cur_node
后删除cur_node.next_.value
。 (也许还有一些我认为没有考虑的问题?最后的pass
语句应该被一些额外的代码替换吗?)