繁体   English   中英

Python 链表实现和 Object 建模

[英]Python Linked List Implementation and Object Modeling

我正在尝试在 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()

output:

10
20
30
40

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

另外,如果我们这样编写 function:

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

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

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

谢谢你。

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

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

append 到第一个节点没有多大意义,是吗? 这将摆脱列表中的 rest。

让我们逐行来看:

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

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

         self.tail = self.tail.next

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

         self.length += 1
         return self

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

如果引用 class 节点,它有两个对象:值和下一个节点。

在链表实现中,它的实现方式是同时存储尾节点信息。 在 append function 中, 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 是头部,20 是尾部
  3. 附加 30 更改列表: self.tail.next -> Node(30) [self.tail here is Node(20)] 并且 Node(30) 现在变成 tail 10 -> 20 -> 30 其中 10 是 head 并且30是尾巴

希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM