基于Python3的数据结构与算法 - 16 链表

news/2024/4/28 16:07:41

目录

链表

1. 创建链表 

2. 链表的插入和删除

3. 双链表 

4. 链表总结


链表

链表是由一系列节点组成的元素集合。每个节点包含两部分,数据域item指向下一个节点得指针next。通过节点之间的相互连接,最终串联成一个链表。

class Node:def __init__(self,item):self.item = itemself.next = Nonea = Node(1)
b = Node(2)
c = Node(3)
a.next = b
b.next = cprint(a.next.item)
print(a.next.next.item)

1. 创建链表 

创建链表共有两种方法:头插法尾插法

链表总有一个头节点和一个尾节点

使用头插法创建链表(将一个列表变为链表)

class Node:def __init__(self, item):self.item = itemself.next = Nonedef create_linklist_head(li):head = Node(li[0])  # 定义头节点for element in li[1:]:node = Node(element)node.next = head  # 将插入进来的元素与head连接起来head = node  # # 再将node定义为头节点return headdef print_linklist(lk):while lk:print(lk.item, end=',')lk = lk.nextlk = create_linklist([1, 2, 3])
# print(lk.item)   # 返回头节点
print_linklist_head(lk)

使用尾插法创建列表 :

def create_linklist_tail(li):head = Node(li[0])  # 定义头节点tail = head # 此时只有一个元素for element in li[1:]:node = Node(element)tail.next = node  # 新来的元素连接到tail后面tail = node     # 再将node定义为尾节点return headlk = create_linklist_tail([1,2,3,4,5,6])
print_linklist(lk)

2. 链表的插入和删除

 列表的插入时间复杂度为O(n), 但是链表不是,因为链表不是顺序存储。

链表的插入分为两步:

  • 先将4与2相连接
  • 再将1与4相连接
p.next = curNode.next
curNode.next = p

如果此时想再将元素4删除:

  • 先将1和2链接起来
  • 再将4删除
p = curNode.next
curNode.next = curNode.next.next
del p

3. 双链表 

 双链表的每个节点有两个指针:一个指向后一个节点,另一个指向前一个节点。

class Node(object):def __init__(self. item = None):self.item = itemself.next = Noneself.prior = None

双链表的插入:

  • 先将2与3相互连接
  • 再将1与2相互连接
p.next = curNode.next
curNode.next.prioi = p
p.prior = curNode
curNode.next = p

双链表的删除:

  • 将1与3互相连接
  • 再将2删除 
p = curNode.next
curNode.next = p.next
p.next.prior = curNode
del p

4. 链表总结

顺序表(列表/数组)与链表复杂度分析:

  • 按元素查找:都是挨个遍历,复杂度都为O(n).
  • 按下标查找:列表中直接存放地址,复杂度为O(1), 链表复杂度为O(n).
  • 在某元素后插入:列表为O(n),链表为O(1)
  • 删除某元素:列表为O(n),链表为O(1)

链表在插入和删除的操作上明显快与顺序表。

链表的内存分配更加灵活。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.cpky.cn/p/10873.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

力扣24. 两两交换链表中的节点

新建虚拟头节点,用3个指针记录前3个节点,然后再相互赋值指向,再移动当前节点,当前节点所在的位置,只能交换该节点的后两个节点(所以必须建立虚拟头节点,才能操作第1,2个节点&#xf…

HCIP —— 交换 (VLAN)

VLAN --- 虚拟局域网 在 HCIA 中 ,已经学过交换机的一些基础配置,下面进行回顾一些简单的内容。 1.创建VLAN VLAN ID --- 区别和标识不同的VLAN 使用范围:0-4095 , 由12位二进制构成。 0 和 4095 作为 保留的VLAN。 …

Android和IOS应用开发-Flutter 应用中实现记录和使用全局状态的几种方法

文章目录 在Flutter中记录和使用全局状态使用 Provider步骤1步骤2步骤3 使用 BLoC步骤1步骤2步骤3 使用 GetX:步骤1步骤2步骤3 在Flutter中记录和使用全局状态 在 Flutter 应用中,您可以使用以下几种方法来实现记录和使用全局状态,并在整个应…

VS Code安装Live Server插件搭建web网页结合内网穿透实现公网访问

文章目录 前言1. 编写MENJA小游戏2. 安装cpolar内网穿透3. 配置MENJA小游戏公网访问地址4. 实现公网访问MENJA小游戏5. 固定MENJA小游戏公网地址 正文开始前给大家推荐个网站,前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默&…

GET和POST方法的区别

GET和POST的区别 在我们开发项目的时候常常会在Controller层使用到POST方法或者GET方法,犹豫到底将接口定义为GET方法还是POST方法?那这两者之间有什么区别呢? 看一下官方定义: GET 和 POST 是 HTTP 协议中最常用的两种请求方法…

【数学建模】传染病模型笔记

传染病的基本数学模型,研究传染病的传播速度、空间范围、传播途径、动力学机理等问题,以指导对传染病的有效地预防和控制。常见的传染病模型按照传染病类型分为 SI、SIR、SIRS、SEIR 模型等,按照传播机理又分为基于常微分方程、偏微分方程、网…