【问题标题】:Python Linked List Implementation and Object ModelingPython 链表实现和对象建模
【发布时间】:2020-03-02 20:58:56
【问题描述】:

我正在尝试在 Python 上实现单链表,下面的代码运行良好,但我不明白如何:

class Node(object):
    def __init__(self, data=None, ):
        self.value = data
        self.next = None

class LinkedList1(object):
    def __init__(self, data=None):
        self.head = Node(data)
        self.tail = self.head
        self.length = 1

    def append(self, data):
        self.tail.next = Node(data)
        self.tail = self.tail.next
        self.length += 1
        return self

    def show_list(self):
        head_copy = self.head
        while head_copy is not None:
            print(head_copy.value)
            head_copy = head_copy.next

当我们测试它时:

linkin = LinkedList1(10)
linkin.append(20)
linkin.append(30)
linkin.append(40)
linkin.show_list()

输出:

10
20
30
40

我不明白的是附加功能。我知道self.tail 引用self.head,但是sefl.tail.next 怎么会在最后一个下一个添加新的Node(data),在我的逻辑中没有循环它应该添加到第一个下一个。

另外,如果我们这样写函数:

def append(self, data):
        self.head.next = Node(data)
        self.tail = self.head.next
        self.length += 1
        return self

即使self.tail 引用self.head,这也不起作用。

我知道我在这里遗漏了一些东西。你能帮我理解吗?

谢谢。

【问题讨论】:

    标签: python data-structures linked-list


    【解决方案1】:

    self.tail 仅在有单个节点时设置为self.head。 tail 总是更改为指向 LAST 节点,与添加第二个节点之前的头节点相同。

    每次调用 append 时,tail 都会更改为指向刚刚添加的节点。

    附加到第一个节点没有多大意义,是吗?那将摆脱列表的其余部分。

    让我们逐行看:

    def append(self, data):
            self.tail.next = Node(data)
    

    在执行此操作之前,self.tail.nextNone,表示列表到此结束。现在我们已经将它设置为一个新节点,这个新节点有一个“下一个”值,即 None。

             self.tail = self.tail.next
    

    由于 self.tail 需要指向列表中的最后一项,我们需要对其进行更改。因此,上面的行将其更改为指向新的最后一项。

             self.length += 1
             return self
    

    这些只是跟踪长度和返回。只要正确完成,您就不需要遍历列表来了解其中有多少节点。

    【讨论】:

    • 很好的解释,你的意思是这样尾部引用包含所有的下一个吗?
    • 它不包含所有的下一个。列表中的每个节点仅包含一个“下一个”,即列表中的下一项。尾部总是没有下一个,因为它是最后一个节点,后面什么都没有。
    【解决方案2】:

    如果引用类Node,它有两个对象:value和next Node。

    在链表实现中,它的实现方式是同时存储尾节点信息。在 append 函数中,self.tail.next = Node(data) 基本上是在尾节点之后添加一个新节点,self.tail = self.tail.next 将链表的尾节点重新分配给新创建的节点(现在是链表的最后一个节点)

    例如,我们来看下面的代码:

    linkin = LinkedList1(10)
    linkin.append(20)
    linkin.append(30)
    linkin.append(40)
    linkin.show_list()
    
    1. 使用 self.head -> Node(10) 和 self.tail -> Node(10) 创建一个链表
    2. 附加 20 会更改列表:self.head -> Node(10), self.tail.next -> Node(20) [与 self.head.next 相同] 10 -> 20 其中 10 是 head 并且20 是尾巴
    3. 追加 30 会更改列表:self.tail.next -> Node(30) [self.tail here is Node(20)] 并且 Node(30) 现在变成了 tail 10 -> 20 -> 30 where 10是头,30是尾

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2012-11-11
      • 2017-12-03
      • 2014-03-07
      • 2010-12-03
      • 2018-04-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多