【问题标题】:Popping last node/item off a single linked list从单个链表中弹出最后一个节点/项目
【发布时间】:2017-08-22 23:26:03
【问题描述】:

首先,我确实看过这个:Deleting the last element in my linked list(研究了它和我的代码一个多小时),但我似乎无法“理解”这个。

我正在尝试:

  1. 删除 - “pop” - 我的单链表中的最后一项;
  2. 返回删除的项目,最后;
  3. 打印出没有删除项目的“新”列表。

这是我的代码:

class Node(object):

    def __init__(self, value, nxt):
        self.value = value
        self.next = nxt

    def __repr__(self):
        nval = self.next and self.next.value or None
        return f"[{self.value}]"#":{repr(nval)}]"

class List(object):

    def __init__(self):
        self.begin = None
        self.end = None

    def push(self, obj):

        node = Node(obj, None) 
        if self.begin == None:
            self.begin = node
            self.end = self.begin

        else:
            self.end.next = node
            self.end = node


     def pop(self):
        end = self.end
        start = self.begin
        while start.next is not None:
            start = start.next
            start.next = None
        return end.value

l = List()

l.push("a")
l.push("b")
l.push("c")
l.push("d")

print (l)

print (l.pop())

print ("AND FINALLY:", l)

当我运行它时,我得到:

abcd

d

最后:ab

当然,我发现我没有足够远地迭代节点以获得“c”节点。我玩了很长时间的循环,无法解决这个问题。

【问题讨论】:

    标签: python-2.7 python-3.x list loops nodes


    【解决方案1】:

    你有条件,同样重要的是缩进错误。您也没有更新self.end 或测试列表中是否只有一项,例如:

    def pop(self):
        end = self.end
        start = self.begin
        if start == end:
            self.begin = self.end = None
            return end.value
    
        while start.next is not end:
            start = start.next
        start.next = None
        self.end = start
        return end.value
    

    注意:如果列表中没有值,这不会解决。

    另请注意:如果 List 类中没有 __repr__()__str__(),您将无法获得预期的输出。

    【讨论】:

    • 知道了。这行得通,谢谢。我仍然没有完全掌握它,但我认为这是因为我已经盯着这个太久了。谢谢。另外,感谢其他输入,但仅供参考,我确实有一个 str 和其他一些功能,但它们都工作正常,所以我不想把这个问题挤满。
    • 另外,如果您愿意提出“跟进”问题 - 您添加的倒数第二行的目的是什么:“self.end = start” - 我没有看到目的所以我“注释掉它”(#)作为测试它的功能的一种方式。输出中没有任何变化。没有侮辱的意思,我相信你有它是有原因的,但我不明白。
    • 尝试弹出 2 个值,第二次弹出会失败,因为您还没有更新 self.endself.end 是为了代表你的列表的结尾,但是你已经弹出了你的结尾,那么列表的新结尾是什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-08
    • 1970-01-01
    • 1970-01-01
    • 2013-07-26
    相关资源
    最近更新 更多