实现链表结构

用面向对象实现LinkedList链表

  • 单向链表实现append、iternodes方法
  • 双向链表实现append、pop(尾部弹出)、insert、remove(使用索引移除)、iternodes方法
  • 为链表提供__getitem__、__iter__、__setitem__等方法

image

链表

实现LinkedList链表

链表有单向链表、双向链表

image

对于链表来说

  • 每一个节点是一个独立的对象,节点对象有内容,还知道下一跳是什么
  • 链表则是一个容器,它内部装着一个个节点对象

所以,建议设计2个类,一个是节点Node类,一个是链表LinkedList类。

如同一个箱子是容器,里面放的小球就是一个个节点。

如同一串珠子,节点对象是一个个珠子,每一颗珠子关联其前后的珠子,所有珠子形成串珠的概念,相当于容器。一串珠子可以从固定一头提起,这是单向链表;如果这串珠子可以从两头中的任意一头提起,这就是双向链表。

单向链表实现

#解决NodeList注解延后,3.10之前使用注解延后评估功能必须有下一句
from  __future__ import  annotations 

class NodeList:
    # 节点保存内容和下一跳
    def __init__(self,item , next:NodeList=None): #注解延后评估
        self.item = item
        self.next = next
    def __repr__(self):
        return str(self.item)

class LinkedList:
    #"容器,有头尾"
    def __init__(self):
        self.head = None
        self.tail = None
    def append(self,item):
        node = NodeList(item)
        #判断链表中是否有元素
        if self.head == None:
            self.head = node
        else:
            self.tail.next = node
        self.tail = node
        return self
    def itemnodes(self):
        current = self.head
        while current:
            yield current
            current = current.next
ll = LinkedList()
ll.append("1")
ll.append(2)
for n in ll.itemnodes():
    print("___",n)

双向链表

双向链表实现append、pop、insert、remove、iternodes 方法

实现单向链表没有实现的pop、remove、insert方法,补上。

双向链表的iternodes要实现两头迭代。