Python链表实现和对象建模

Python链表实现和对象建模,python,data-structures,linked-list,Python,Data Structures,Linked List,我正在尝试在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)

我正在尝试在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
我不懂的是append函数。我知道
self.tail
引用
self.head
但是为什么
sefl.tail.next
会将新的
节点(数据)
添加到最后一个下一个,在我的逻辑中没有循环,它应该添加到第一个下一个

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

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
。尾部始终更改为指向最后一个节点,仅在添加第二个节点之前与头部节点相同

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

附加到第一个节点没有多大意义,是吗?这样就可以去掉名单上的其他部分

让我们一行一行地看:

def append(self, data):
        self.tail.next = Node(data)
执行此操作之前,
self.tail.next
None
,表示列表到此结束。现在我们已经将其设置为一个新节点,该新节点的“next”值为None

         self.tail = self.tail.next
因为self.tail需要指向列表中的最后一项,所以我们需要更改它。因此,上面的行将其更改为指向新的最后一项

         self.length += 1
         return self

这些只是跟踪长度和返回。只要操作正确,您就不需要遍历列表,只需知道其中有多少个节点。

如果您指的是类节点,它有两个对象:value和next Node

在链表实现中,它以这样一种方式实现,即尾部节点信息也被存储。在append函数中,
self.tail.next=Node(data)
基本上在tail节点之后添加一个新节点,并且
self.tail=self.tail.next
将链表的tail节点重新分配给新创建的节点(现在是列表的最后一个节点)

例如,让我们以以下代码为例:

linkin = LinkedList1(10)
linkin.append(20)
linkin.append(30)
linkin.append(40)
linkin.show_list()
  • 使用self.head->Node(10)和self.tail->Node(10)创建链表
  • 添加20将更改列表:self.head->Node(10),self.tail.next->Node(20)[与self.head.next]10->20相同,其中10为head,20为tail
  • 添加30会更改列表:self.tail.next->Node(30)[self.tail这里是Node(20)],节点(30)现在变成tail 10->20->30,其中10是head,30是tail

  • 希望这能有所帮助。

    很好的解释,你的意思是尾部引用可以保存所有的NEXT吗?它不能保存所有的NEXT。列表中的每个节点只保存一个“下一个”,即列表中下一个项目的下一个。尾部总是没有下一个节点,因为它是最后一个节点,后面什么也没有。