【Python】python链表

python链表总结

原Blog链接:https://blog.csdn.net/qq_44941689/article/details/122402938

1. 链表基本类型

  • 链表(Linked List):一种线性表数据结构。它使用一组任意的存储单元(可以是连续的,也可以是不连续的),来存储一组具有相同类型的数据。即「链表」 是实现线性表的链式存储结构的基础。
  • 单链表每个数据元素占用若干存储单元的组合称为一个「链节点」,还要存放一个指出这个数据元素在逻辑关系上的直接后继元素所在链节点的地址,该地址被称为「后继指针 next」。
    在这里插入图片描述
  • 双向链表(Doubly Linked List):链表的一种,也叫做双链表。它的每个链节点中有两个指针,分别指向直接后继和直接前驱。
    在这里插入图片描述
  • 循环链表(Circular linked list):链表的一种。它的最后一个链节点指向头节点,形成一个环。
    在这里插入图片描述

2. 链表基本操作

2.1 链表的结构定义

  • 链表是由链节点通过 next 链接而构成的,所以先来定义一个简单的链节点类,即 ListNode 类。ListNode 类使用成员变量 val 表示数据元素的值,使用指针变量 next 表示后继指针;
  • 然后再定义链表类,即 LinkedList 类。ListkedList 类中只有一个链节点变量 head 用来表示链表的头节点。
# 链节点类
class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

# 链表类
class LinkedList:
    def __init__(self):
        self.head = None

2.2 线性链表

建立一个线性链表的过程是:根据线性表的数据元素动态生成链节点,并依次将其连接到链表中。其做法如下:

  • 从所给线性表的第 1 个数据元素开始依次获取表中的数据元素;
  • 每获取一个数据元素,就为该数据元素生成一个新节点,将新节点插入到链表的尾部;
  • 插入完毕之后返回第 1 个链节点的地址。
# 根据 data 初始化一个新链表
def create(self, data):
    self.head = ListNode(0)
    cur = self.head
    for i in range(len(data)):
        node = ListNode(data[i])
        cur.next = node
        cur = cur.next
2.2.1 求线性链表的长度

线性链表的长度被定义为链表中包含的链节点的个数。求线性链表的长度操作只需要使用一个可以顺着链表指针移动的指针变量 cur 和一个计数器 count。具体做法如下:

  • 让指针变量 cur 指向链表的第 1 个链节点;
  • 然后顺着链节点的 next 指针遍历链表,指针变量 cur 每指向一个链节点,计数器就做一次计数;
  • 等 cur 指向为空时结束遍历,此时计数器的数值就是链表的长度,将其返回即可。
    求线性链表的长度操作的问题规模是链表的链节点数 n,基本操作是 cur 指针的移动,操作的次数为 n,因此算法的时间复杂度为 O ( n ) O(n) O(n)
# 获取链表长度
def length(self):
    count = 0
    cur = self.head
    while cur:
        count += 1
        cur = cur.next 
    return count
2.2.2 查找元素

在链表中查找值为 val 的位置:链表不能像数组那样进行随机访问,只能从头节点 head 开始,沿着链表一个一个节点逐一进行查找。如果查找成功,返回被查找节点的地址。否则返回 None。

查找元素操作的问题规模是链表的长度 n,而基本操作是指针 cur 的移动操作。

2.2.3 插入元素

链表中插入元素操作分为三种:

  • 链表头部插入元素:在链表第 1 个链节点之前插入值为 val 的链节点。
  • 链表尾部插入元素:在链表最后 1 个链节点之后插入值为 val 的链节点。
  • 链表中间插入元素:在链表第 i 个链节点之前插入值为 val 的链节点。
链表头部插入元素

算法实现的步骤为:

  • 先创建一个值为 val 的链节点 node。
  • 然后将 node 的 next 指针指向链表的头节点 head。
  • 再将链表的头节点 head 指向 node。
    在这里插入图片描述
# 头部插入元素
def insertFront(self, val):
    node = ListNode(val)
    node.next = self.head
    self.head = node
链表尾部插入元素

算法实现的步骤为:

  • 先创建一个值为 val 的链节点 node。
  • 使用指针 cur 指向链表的头节点 head。
  • 通过链节点的 next 指针移动 cur 指针,从而遍历链表,直到 cur.next == None。
  • 令 cur.next 指向将新的链节点 node。
    在这里插入图片描述
# 尾部插入元素
def insertRear(self, val):
    node = ListNode(val)
    cur = self.head
    while cur.next:
        cur = cur.next
    cur.next = node
链表中间插入元素

算法的实现步骤如下:

  • 使用指针变量 cur 和一个计数器 count。令 cur 指向链表的头节点,count 初始值赋值为 0。
  • 沿着链节点的 next 指针遍历链表,指针变量 cur 每指向一个链节点,计数器就做一次计数。
  • 当 count == index - 1 时,说明遍历到了第 index - 1 个链节点,此时停止遍历。
  • 创建一个值为 val 的链节点 node。
  • 将 node.next 指向 cur.next。
  • 然后令 cur.next 指向 node。
    在这里插入图片描述
# 中间插入元素
def insertInside(self, index, val):
    count = 0
    cur = self.head
    while cur and count < index - 1:
        count += 1
        cur = cur.next
        
    if not cur:
        return 'Error'
    
    node = ListNode(val)
    node.next = cur.next
    cur.next = node
改变元素

将链表中第 i 个元素值改为 val:首先要先遍历到第 i 个链节点,然后直接更改第 i 个链节点的元素值。具体做法如下:

  • 使用指针变量 cur 和一个计数器 count。令 cur 指向链表的头节点,count 初始值赋值为 0。
  • 沿着链节点的 next 指针遍历链表,指针变量 cur 每指向一个链节点,计数器就做一次计数。
  • 当 count == index 时,说明遍历到了第 index 个链节点,此时停止遍历。
  • 直接更改 cur 的值 val。
# 改变元素
def change(self, index, val):
    count = 0
    cur = self.head
    while cur and count < index:
        count += 1
        cur = cur.next
        
    if not cur:
        return 'Error'
    
    cur.val = val
删除元素

链表的删除元素操作同样分为三种情况:

  • 链表头部删除元素:删除链表的第 1 个链节点。
  • 链表尾部删除元素:删除链表末尾最后 1 个链节点。
  • 链表中间删除元素:删除链表第 i 个链节点。
链表头部删除元素

直接将 self.head 沿着 next 指针向右移动一步即可。
在这里插入图片描述

# 链表头部删除元素
def removeFront(self):
    if self.head:
        self.head = self.head.next
链表中间删除元素

删除链表中第 i 个元素的算法具体步骤如下:

先使用指针变量 cur 移动到第 i - 1 个位置的链节点。
然后将 cur 的 next 指针,指向要第 i 个元素的下一个节点即可。
在这里插入图片描述

# 链表中间删除元素
def removeInside(self, index):
    count = 0
    cur = self.head
    
    while cur.next and count < index - 1:
        count += 1
        cur = cur.next
        
    if not cur:
        return 'Error'
        
    del_node = cur.next
    cur.next = del_node.next

2.3 其他链表的操作

  • 待更新…
  • 56
    点赞
  • 282
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
链表是一种常用的数据结构,它由若干个节点组成,每个节点包含一个数据项和一个指向下一个节点的指针。在Python中,可以使用ListNode类来定义链表节点。在给定的代码中,定义了两个有序链表,分别是2->3->4->9和3->5->7->8。这里的"->"表示节点之间的指针关系。通过赋值操作,将节点依次连接起来,形成了两个完整的链表。 要对链表进行操作,可以使用链表的基本操作方法。常见的链表操作包括插入节点、删除节点、查找节点等。在Python中,我们可以通过定义链表的各种方法来完成这些操作。 下面是链表操作的基本步骤: 1. 定义一个链表节点类ListNode,其中包含一个数据项和一个指向下一个节点的指针。 2. 创建链表的头节点head,并初始化为空。 3. 根据具体需求,使用插入节点方法将节点插入链表中。 4. 使用删除节点方法删除链表中的指定节点。 5. 使用查找节点方法查找链表中指定的节点。 需要注意的是,上述代码中使用的是ListNode类,可以根据实际需要进行调整。另外,链表操作还可以使用其他的库和方法,如pymysql库可以用于操作MySQL数据库。 通过以上步骤和方法,可以简单实操链表python的基本操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [剑指offer——python【第16题】合并两个有序链表](https://blog.csdn.net/weixin_39933336/article/details/110781985)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Python--简单操作数据库](https://blog.csdn.net/Liqiufeng_/article/details/108013260)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值