【问题标题】:Python:Moving through linked list 'next'Python:通过链表“下一个”移动
【发布时间】:2017-04-16 10:36:01
【问题描述】:

我正在完成第 6 版的《Cracking the Coding Interview》,不确定他们对“下一个”的定义

他们定义“链表”的代码可以在here找到。我正在尝试第二个练习,即从随机链表的末尾元素中找到第 k 个。

我的代码:

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'

编辑2:

如果我注释掉“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

这可以很好地打印列表

【问题讨论】:

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


    【解决方案1】:

    您应该使用val = val.next 而不是val.next = val.next.next。按照您的操作方式,当您调用count_length 时,列表将被截断为单个元素。因为您在kth_to_last 的顶部执行count_length,所以当您开始遍历您的列表(您的'hi' 所在的位置)时,该列表已经缩减为单个节点。

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

    当你处理一个链表(count_length,或kth_to_last)时,你要做的就是依次指向每个节点。您不会尝试修改节点本身,因此您不会分配给它们的 valuenext 属性。这样做的方法是更改​​您的指针 (val) 指向的内容,而您希望它指向的下一个节点是下一个节点。因此:

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

    【讨论】:

    • 谢谢@wildwilhelm,这很有道理,我会解决的。
    • 所以问题似乎与我对“count_length”的调用有关,因为如果我将其注释掉,那么 val_next 就可以了。为什么计算长度会改变 ll?
    • 谢谢@wildwilhelm,我刚刚看到你的完整评论——这完全有道理。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-19
    • 1970-01-01
    • 1970-01-01
    • 2021-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多