链表基本原理

1.链表

1.1 基本原理

  • 节点
    • 组成链表的数据格子不是连续的。可以分布在内存的各个位置。这种不相邻的格子就叫结点。
    • 每个结点保存数据还保存着链表里的下一结点的内存地址。
  • 链表(Linkedlist)
    • 链表结构相对于顺序表可以充分利用计算机内存空间。
    • 实现灵活的内存动态管理且进行扩充时不需要进行数据搬迁。
    • 是一种常见的基础数据结构,是一种线性表

1.2 链表大O记法表示

操作大O记法表示【最坏情况】默认采用大O记法表示【最好情况】
读取O( N N N)O(1)
查找O( N N N)O(1)
插入O( N N N)O(1)
删除O( N N N)O(1)

2. 链表操作

2.1 读取

  • 链表的结点可以分布在内存的任何位置。
  • 根据索引读取
  • 读取值:必须先读取索引为0的链,顺着该链去找索引1。根据索引 1 的链去找索引 2…最终找到自己要读取的值。
    在这里插入图片描述

2.2 查找

  • 根据值查找是否存在
  • 根据读取一样,在读取每个索引节点时,读取值判断是否与查找的值相等,否则读取下一个节点,直到末尾未找到值。
    在这里插入图片描述

2.3 插入

  • 开头插入:创建新节点,将新节点链表指向的下一个内存地址为原先链表头部即可
  • 中间插入:创建新节点,读取链表索引0,根据索引0找到下一个节点,依此类推找到要插入的位置,将插入索引前面的索引节点链表指向的下一个内存地址为新节点位置,将新节点指向的下一个内存地址为插入索引后面的索引节点
  • 末尾插入:创建新节点,读取链表索引0,根据索引0找到下一个节点,依此类推找到末尾位置,将末尾内存节点null设置为新节点的内存地址,将新节点指向的下一个内存地址设为null
    在这里插入图片描述

2.4 删除

  • 开头删除:将链表的第二个节点设置为第一个节点即可
  • 中间删除:遍历链表,遍历到要删除的索引,将删除的前一个节点指向下一个内存地址重新指向删除节点的后一个节点即可
  • 末尾删除:遍历链表,遍历到倒数第二个节点,将此节点指向的下一个节点地址设为null即可
    在这里插入图片描述

3.链表代码实现

# 节点封装
class Node():
    def __init__(self, item):
        self.item = item
        self.next = None


# 链表封装
class Link():
    def __init__(self):  # 构建一个空链表
        self._head = None  # _head永远要指向链表中的第一个节点,None表示链表没有节点

    # 读取操作
    def read(self,index):
        count = 0
        current = self._head
        while True:
            if count!=index:
                count += 1
                current = current.next
            else:
                item=current.item
                print(f'索引{index}的值为:{item}')
                break
        return item

    # 查找操作
    def search(self, item):  # 查找节点是否存在
        current = self._head
        find = False
        count=0
        while current:
            if current.item == item:
                find = True
                print(f'值为{item}的索引为:{count}')
                break
            else:
                current = current.next
                count+=1
        return find

    # 插入操作
    def add(self, item):  # 开头插入
        node = Node(item) # 实例化一个新的节点
        node.next = self._head
        self._head = node
    def insert(self, pos, item):  # 中间插入
        node = Node(item)
        current = self._head
        temp = None
        # 单独判断插入位置为0的节点
        if pos == 0:
            self.add(item)
            # node.next = self._head
            # self._head = node
            return
        for i in range(pos):
            temp = current
            current = current.next
        temp.next = node
        node.next = current
    def append(self, item):  # 尾部插入
        # 实例化一个新的节点
        node = Node(item)
        # 如果链表为空
        if self._head == None:
            self._head = node
            # 如果链表为非空
        temp = None
        current = self._head
        while current:
            temp = current
            current = current.next
        temp.next = node

    # 删除操作
    def delete(self, item):  # 将item对应的节点删除
        current = self._head
        temp = None
        if current.item == item:  # 删除的节点是第一个节点
            self._head = current.next
            return
        while current:
            temp = current
            current = current.next
            if current.item == item:
                temp.next = current.next
                return
    # 遍历整个链表
    def travel(self):
        # print(self._head.item)
        # print(self._head.next.item)
        # print(self._head.next.next.item)
        # current指向第一个节点
        # _head永远要指向第一个节点,轻易不要修改_head指向
        current = self._head
        while current:
            print(current.item,end='\t')
            current = current.next
        print('\n')

    def isEmpty(self):  # 链表是否为空
        return self._head == None


    def length(self):  # 返回列表中节点的个数
        count = 0
        current = self._head
        while current:
            count += 1
            current = current.next
        return count

    # 翻转
    def reverse(self):
        pre = self._head
        cur = pre.next
        next_node = cur.next
        pre.next = None
        while True:
            cur.next = pre
            pre = cur
            cur = next_node
            if next_node != None:
                next_node = next_node.next
            else:
                break
        self._head = pre
link = Link()
# 插入
# 头部
for i in range(1,6):
    link.add(i)
print('头部添加元素链表为:',end='')
link.travel()

# 中间
link.insert(1, 1234)
print('中间添加元素链表为【(1, 1234)】:',end='')
link.travel()

# 尾部
link.append(12)
print('尾部添加元素12链表为:',end='')
link.travel()

# 读取
link.read(1)

# 查找
link.search(4)

# 删除
link.delete(3)
print('删除元素3后链表为:',end='')
link.travel()

print("链表长度为:"+str(link.length()))
print("链表反转后值为:")
link.reverse()
link.travel()

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

荼靡~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值