Python:浏览链接列表' next'

时间:2016-12-01 17:15:44

标签: python linked-list singly-linked-list

我正在通过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

这样可以很好地打印列表

1 个答案:

答案 0 :(得分:1)

您应该val = val.next而不是val.next = val.next.next。你这样做的方式,当你调用count_length时,列表将被截断为单个元素。因为您在count_length的顶部kth_to_last,所以当您到达列表('hi'所在的位置)时,列表已经缩减为单个节点。

请记住,linked list是一个结构,其中每个节点的next属性是指向下一个节点的指针。您的代码正在修改next的值,这会改变链接列表的结构。

当您处理链接列表(在count_lengthkth_to_last中)时,您要做的是依次指向每个节点。您不是要自己修改节点,因此不会分配到valuenext属性。执行此操作的方法是更改​​指针(val)所指向的内容,并且您希望它指向下一个节点的是下一个节点。因此:

val = ll.head
while val is not None:
    # do something with val here
    val = val.next