Python-链表数据结构学习(1)

一、什么是链表数据?

链表是一种通过指针串联在一起的数据结构,每个节点由2部分组成,一个是数据域 ,一个是指针域 (存放下一个节点的指针)。最后一个节点的指针域指向null (空指针的意思),链表的入口节点称为链表的头结点 也就是head

链表结构如下图

二、链表的类型

1、单链表每个节点的指针指向一个方向,只可单方向查询数据,如上图所示。

2、双链表,每个节点可以有2个指针域,既可指向下一个节点,也可指向上一个节点,双链表既可以向前查询,也可以向后查询。

如图3、循环链表:链表首尾相连,可以用来解决约瑟夫环问题。如图
三、链表的存储方式

链表的存储于数组不同,数组在空间中可以是连续的,而链表是通过指针域的指针将不连续的数据存储在空间各个节点中的,因此指针节点 在链表数据的应用中非常关键。所以链表中的节点在内存中不是连续分布的 ,而是散乱分布在内存中的某地址上,分配机制取决于操作系统的内存管理。

四、链表的定义

了解了链表的结构组成,我们来了解一下链表的Python 实现,链表作为一个类,他需要构造。

复制代码
class ListNode:
    def __init__(self, val, next=None):##定义一个列表函数,包含数据值和指针()
        self.val = val #定义列表节点的self.val为val
        self.next = next #定义列表指针的self.next为next

五、常见的链表操作

1、删除节点

如图想要删除D节点,就要先将D节点上一个指针指向E节点,在Python语言中,会自动将D节点释放掉,此时就可以删除D节点了。

2、节点添加
如图想要在D节点前添加F节点,需要先把C节点指向F节点,然后再把F节点的指针指向D节点,在这个过程中Python系统会自动释放C到D的指针指向。

链表的增添和删除都是O(1)操作,也不会影响到其他节点。

但是要注意,要是删除第五个节点,需要从头节点查找到第四个节点通过next指针进行删除操作,查找的时间复杂度是O(n)。

六、链表和数组操作比较

数组在定义的时候,长度就是固定的,如果想改动数组的长度,就需要重新定义一个新的数组。

链表的长度可以是不固定的,并且可以动态增删, 适合数据量不固定,频繁增删,较少查询的场景。

Leetcode203题

复制代码
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def removeElements(self, head: Optional[ListNode], val: int) -> Optional[ListNode]:
        cur=dummy=ListNode(next=head) ##构建一个虚拟哨兵节点,使得他的指针指向头结点
        while cur.next: ##当当前节点的指针存的时候
            if cur.next.val==val: ##如果当前节点的下一个节点的值等于指定的值,
                cur.next=cur.next.next #则删除下一个节点
            else:
                cur=cur.next #否则当前链表向下一个节点移动
        return dummy.next #返回链表(因为dummy是头结点前的一个虚拟节点,所以返回的是dummy.next)
复制代码
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:
        cur=head
        pre=None
        while cur:
            tem=cur.next##保存cur后续数据
            cur.next=pre##cur指针方向改变
            pre=cur ##把当前的cur付给pre,进行下一次循环
            cur=tem ##把之前保存的cur后续数据再赋值给当前的cur,进行下一次循环
        return pre
相关推荐
小高Baby@21 小时前
JSON、bind、form
数据结构·json
laplace012321 小时前
Claude Code 逆向工程报告 笔记(学习记录)
数据库·人工智能·笔记·学习·agent·rag
lingggggaaaa21 小时前
安全工具篇&Go魔改二开&Fscan扫描&FRP代理&特征消除&新增扩展&打乱HASH
学习·安全·web安全·网络安全·golang·哈希算法
Daydream.V1 天前
网页学习——HTML
学习
张永清-老清1 天前
每周读书与学习->JMeter性能测试脚本编写实战(四)-利用JMeter对MySQL数据库查询进行性能测试
学习·jmeter·性能调优·jmeter性能测试·性能分析·每周读书与学习
InterestOriented1 天前
中老年线上学习发展:兴趣岛“内容+服务+空间”融合赋能下的体验升级
人工智能·学习
宇钶宇夕1 天前
CoDeSys入门实战一起学习(二十八):(ST)三台电机顺起逆停程序详解
运维·学习·自动化·软件工程
£漫步 云端彡1 天前
Golang学习历程【第十篇 方法(method)与接收者】
开发语言·学习·golang
im_AMBER1 天前
Leetcode 111 两数相加
javascript·笔记·学习·算法·leetcode
TracyCoder1231 天前
LeetCode Hot100(21/100)——234. 回文链表
算法·leetcode·链表