Python链表实现和对象建模



我正在尝试在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,这也不起作用。

我知道我在这里错过了什么。你能帮我理解吗?

谢谢。

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

在链表实现中,它的实现方式是同时存储尾节点信息。在附加功能中,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->节点(30([self.tail此处为节点(20(],节点(30

希望这能有所帮助。

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

每次调用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

这些只是记录长度和返回。只要做得正确,你就不需要浏览列表来知道其中有多少节点

相关内容

  • 没有找到相关文章

最新更新