链表

  • 特性: 链表结构可以充分利用计算机的内存空间,实现灵活的内存动态管理且进行扩展时不需要进行数据搬迁。
  • 链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是不像顺序表一样连续存储数据,而是每一个结点(数据存储单元)里存放下一个结点的信息(即地址)

python如何创造链表并对它进行赋值 python的链表怎么用_链表

# 实现代码
"""
add(item):链表头部添加元素
travel():遍历整个链表
is_empty():链表是否为空
length():链表长度
append(item):链表尾部添加元素
insert(pos, item):指定位置添加元素
remove(item):删除节点
search(item):查找节点是否存在
"""

class Node:
    """ 节点类 """

    def __init__(self, item):
        self.item = item  # 数据
        self.next = None  # 指向下一个节点的


class Link:
    """ 链表 """

    def __init__(self):
        self._head = None

    def add(self, item):
        """ 链表头部添加元素 """
        node = Node(item)  # 实例化一个新数据的节点B
        node.next = self._head  # 将新节点B的next指向之前头部指向的节点A
        self._head = node  # 将头部指向新节点B

    def travel(self):
        """ 遍历整个链表 """
        cur = self._head  # 将节点D赋值给cur
        while cur:
            """ 存在节点时,就触发循环 """
            print(cur.item)
            cur = cur.next  # 第一轮就将节点C赋值给cur,依次循环

    def is_empty(self):
        """ 链表是否为空 """
        return self._head is None  # 头部指向为空,即空

    def length(self):
        """ 链表长度 """
        count = 0  # 生成一个计数器
        cur = self._head  # 将节点D赋值给cur
        while cur:
            """ 存在节点时,就触发循环 """
            count += 1  # 跑一次循环,计时器就加1
            cur = cur.next

        return count

    def append(self, item):
        """ 链表尾部添加元素 """
        node = Node(item)  # 实例化一个新节点F
        if self._head is None:
            """ 说明链表为空 """
            self.add(node)
            return

        cur = self._head  # 将节点D赋值给cur
        pre = None

        while cur:
            pre = cur  # 将循环最后一轮的节点赋值给pre,即节点A
            cur = cur.next

        pre.next = node  # 将节点A的下一个节点指向新节点F即可

    def search(self, item):
        """ 查找节点是否存在 """
        cur = self._head  # 将节点D赋值给cur
        while cur:
            if cur.item == item:
                """ 存在返回True """
                return True
            else:
                cur = cur.next

        return False

    def insert(self, pos, item):
        """ 指定位置添加元素 """
        if pos == 0:
            self.add(item)
            return

        node = Node(item)
        cur = self._head  # 将节点D赋值给cur
        pre = None
        for i in range(pos):
            pre = cur
            cur = cur.next

        # 要插入的数据就处于pre和cur两个节点之间
        pre.next = node
        node.next = cur

    def remove(self, item):
        """ 删除节点 """
        cur = self._head
        if item == cur.item:
            """ 如果删除的是第一个节点 """
            self._head = cur.next
            return

        pre = None
        while cur:
            pre = cur
            cur = cur.next

            if cur.item == item:
                pre.next = cur.next
                return

    def reverse(self):
        """ 反转 """
        pre = None  # 节点前一个
        cur = self._head  # 节点D
        n = cur.next  # 节点C

        while cur:
            """ 当cur为空时,也就是此时pre是节点A """
            cur.next = pre  # 第一轮将节点D的next指向None,因为节点D要成为最后一个节点
            pre = cur  # 向右偏移一位
            cur = n
            if cur is not None:
                n = n.next

        self._head = pre  # 循环结束后,此时pre是数据A


link = Link()
link.add(1)
link.add(2)
link.add(3)
link.insert(0, 12)
link.remove(3)
print(link.search(22))
link.reverse()
link.travel()