Python:在链表"下一个"中移动



我正在通过破解编码访谈的第6版,不确定他们对'Next'

的定义

他们定义"链接列表"的代码可以在此处找到。我正在尝试第二次练习,即从随机链接列表的末端找到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)

它在列表中计数很好,但是对于第一个定义,我无法通过链接列表移动(根本不会打印" HI")。

我计划做一些我已经评论的事情(它们也定义了"尾巴",所以我可能会尝试一下),但是我很困惑为什么我可以在'count_length''中仔细阅读列表,但是我似乎无法在" kth_to_last"中通过它?

编辑:要澄清,如果我在'kth_to_last'中打印val.next,它的值为'none'

edit2:

如果我评论" count_length",那么下一个进行的运行正好。有人可以向我解释为什么称此功能接下来会改变。它把我困在列表的尽头吗?

我的代码:

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

这将列表打印好

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

记住,链接列表是每个节点的next属性是指向下一个节点的指针。您的代码正在修改next的值,该值正在更改链接列表的结构。

当您处理链接列表(在count_lengthkth_to_last中)时,您想做的就是依次指向每个节点。您不会尝试修改节点本身,因此您不会分配给其valuenext属性。这样做的方法是更改指针(val)所指向的内容,而您希望它指向下一个的内容是下一个节点。因此:

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

相关内容

最新更新