我正在通过Cracking the Coding Interview第6版进行工作,并且不确定他们对“#next”的定义'
他们的代码定义"链接列表"可以找到here。我正在尝试第二个练习,即从随机链表的结尾元素中找到kth。
我的代码:
from LinkedList import LinkedList
def kth_to_last(ll, k):
num_seen = 0
length_list = count_length(ll)
val = ll.head
# ISSUE IS HERE
while val.next != None:
print 'hi'
val.next = val.next.next
"""
while num_seen < (length_list - k):
val = val.next
num_seen += 1
"""
return val.next
# Counts length of LL
def count_length(ll):
val = ll.head
count = 1
while val.next != None:
count += 1
val.next = val.next.next
return count
ll = LinkedList()
ll.generate(10, 0, 99)
print(ll)
kth_to_last(ll, 3)
它在列表中计算得很好,但是对于第一个定义,我无法通过链接列表(它不会打印&#39; hi&#39) ;在所有)。
我打算做一些像我已经注释掉的事情(他们也有定义,所以我可能会尝试一下),但我很困惑为什么我可以在列表中移动就好了在&#39; count_length,&#39;但是,我似乎无法在&#39; kth_to_last&#39;
内完成它?编辑:澄清一下,如果我在&#39; kth_to_last&#39;中打印val.next它的值为“无”&#39;
EDIT2:
如果我注释掉&#34; count_length,&#34;接下来进行得很好。有人可以向我解释为什么调用此函数会改变下一步。它是否让我陷入了清单的最后?
我的代码:
def kth_to_last(ll, k):
"""
num_seen = 0
length_list = count_length(ll)
"""
# Start at head
val = ll.head
while val.next != None:
print val.next
val = val.next
这样可以很好地打印列表
答案 0 :(得分:1)
您应该val = val.next
而不是val.next = val.next.next
。你这样做的方式,当你调用count_length
时,列表将被截断为单个元素。因为您在count_length
的顶部kth_to_last
,所以当您到达列表('hi'
所在的位置)时,列表已经缩减为单个节点。
请记住,linked list是一个结构,其中每个节点的next
属性是指向下一个节点的指针。您的代码正在修改next
的值,这会改变链接列表的结构。
当您处理链接列表(在count_length
或kth_to_last
中)时,您要做的是依次指向每个节点。您不是要自己修改节点,因此不会分配到value
或next
属性。执行此操作的方法是更改指针(val
)所指向的内容,并且您希望它指向下一个节点的是下一个节点。因此:
val = ll.head
while val is not None:
# do something with val here
val = val.next