【问题标题】:Python - Linked List node comparision requires additional dereferencingPython - 链表节点比较需要额外的取消引用
【发布时间】:2017-10-17 04:28:13
【问题描述】:

我正在使用 Python 3.6.3。我正在尝试用 Python 编写一个简单的链表。这是我的代码:

    class Node(object):
    """Represents a node within a linked list"""
    def __init__(self, data, next=None):
        self.stuff = data
        self.next = next

    def __str__(self):
        return str(self.stuff)

class LinkedList(object): 
    def __init__(self):
        self.head = None
        self.size=0

    def append(self, data):
        if not self.head:
            self.head = Node(data)
            return
        else:
            n=self.head
            while n.next:
                n = n.next

            new_node = Node(data)
            n.next = new_node
            return

    def insertAfter(self, data, newNode):
        if not self.head:
            return
        else:
            n=self.head
            while n and n.stuff != data:
                n = n.next

            if not n:
                return
            else:
                newNode.next = n.next
                n.next = newNode
                return

    def printlist(self):
        if not self.head:
            print("List is empty")
            return
        else:
            n = self.head
            while n:
                print(str(n))
                n = n.next
        return

ll = LinkedList()
ll.append(Node("1"))
ll.append(Node("2"))
ll.append(Node("3"))
ll.insertAfter("2", Node("2.5"))
ll.printlist()

我希望它打印出来:

1
2
2.5
3

但是,它会打印:

1
2
3

经过调试,发现在insertAfter方法中改了这一行:

while n and n.stuff != data:

到:

while n and n.stuff.stuff != data:

打印预期的输出。 我不明白它为什么这样做。 请帮忙。 谢谢

【问题讨论】:

    标签: python linked-list


    【解决方案1】:

    问题是您没有将 1、2、3 添加到 LinkedList 并让它创建一个 Node 来包装每个。您正在添加一个Node,其stuff 变量为1、2 和3。当您调用append 方法来添加每个Node 时,它们会被append 方法包装在另一个Node 中。因此,您需要调用 Node.stuff.stuff 来访问实际存储的元素。

    看看你的append 方法实际上在做什么。它接受一些参数data,然后使用self.head = Node(data) 行或new_node = Node(data) 行创建一个Node,具体取决于LinkedList 是否已经有一个头部Node

    ll.append(Node("1")) 更改为 ll.append("1")。或者,更改您的 append 方法以假设它被传递一个 Node 对象。 第一个解决方案更可取,因为 Node 类在 LinkedList 类的上下文之外几乎没有用处,而 LinkedList 除非填充 Nodes 否则不起作用;让LinkedList 类的用户每次都必须创建一个Node 似乎是一项额外的工作。

    编辑:您将数字作为字符串传递的原因是什么?除非您特别希望它们是字符串,否则您不需要将 1、2、2.5 和 3 放在引号中 - 但如果是这样,为什么?

    【讨论】:

    • 我现在觉得好傻!!我在玩弄东西的时候做了那个改变,并且已经忘记了我在 append 方法中做了那个改变。谢谢。
    猜你喜欢
    • 2013-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-22
    • 2012-08-22
    • 2023-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多