首页 > 其他分享 >3.1.链表

3.1.链表

时间:2025-01-11 12:57:23浏览次数:3  
标签:指向 删除 链表 循环 3.1 节点 指针

链表

链表是一种常见的基础数据结构,它由一系列节点组成,这些节点不必在内存中相连,而是通过指针相互连接,形成一个链式结构。以下是链表的详细定义:

  • 节点结构:链表中的每个节点至少包含两个部分,即数据域和指针域。
    • 数据域:用于存储节点的数据,可以是各种数据类型,例如整数、字符、字符串,也可以是更复杂的结构体或对象。
    • 指针域:存储指向下一个节点的地址(在单向链表中)或指向前一个节点和后一个节点的地址(在双向链表中),通过指针将各个节点链接在一起,形成链表的链式结构。
  • 链表类型
    • 单向链表:每个节点只有一个指针域,指向后继节点。链表有一个头指针,指向链表的第一个节点,最后一个节点的指针域通常为NULL,表示链表的结束。
    • 双向链表:每个节点有两个指针域,一个指向前驱节点,一个指向后继节点。这样可以在两个方向上遍历链表,增加了操作的灵活性。
    • 循环链表:可以是单向循环链表或双向循环链表。在单向循环链表中,最后一个节点的指针指向链表的头节点,形成一个环;双向循环链表中,头节点的前驱指针指向尾节点,尾节点的后继指针指向头节点。
简单链表

也是单向链表,每个节点包含一个数据和一个指向下一个节点的指针,最后一个节点的指针指向nullptr(空指针)。如图:

单向链表

在前面的定义中也提到,链表的各个节点并不必须是在内存中连续的,所以对于链表来说,优缺点就很显而易见了,优点就是执行插入和删除等操作十分灵活,而在随机访问元素时效率较低。数组在删除和插入元素的时候,最坏的情况是删除和插入第一个元素,这样要把整个数组的所有元素前移或者后移一位,复杂度为O(n),最好的情况是删除和插入最后一个元素,复杂度为O(1),平均复杂度也为O(n/2)=O(n)。下面用几个图来解释一下删除和插入操作与普通的数组有什么不同。

1.链表的删除

对于链表的删除,我们只需要改变要删除的节点的前驱元的指针即可,十分便捷

删除元素

2.链表的插入

而链表的插入就需要改变一个指针和新建一个指针了,不过相较于数组的操作简单的多,

插入元素

双向链表

相较于简单链表,每个节点新增了一个指向前驱元的指针,第一个元素的前指针指向nullptr

双向链表

这样做的好处就是可以从后往前遍历链表,更灵活。

循环链表

相较于前两个,循环链表就是在前面的基础上进行了闭环。单向循环链表就是把最后一个节点的指针指向第一个节点,双向循环链表就是把第一个节点的前指针指向最后一个节点,最后一个节点的后指针指向第一个节点,这里就不进行画图演示了。

标签:指向,删除,链表,循环,3.1,节点,指针
From: https://blog.csdn.net/m0_60046831/article/details/145057104

相关文章

  • List详解 - 双向链表的操作
    在C++中,std::list是标准模板库(STL)中的一个容器,它实现了双向链表的数据结构。与数组或向量(std::vector)不同,std::list允许在常数时间内进行插入和删除操作,尤其是在链表的任意位置。本文将详细介绍std::list的基本操作,并通过示例代码帮助读者理解其使用方法。1. std::list 的基......
  • LeetCode:141.环形链表
    //双指针快+1=慢trueclassListNode{constructor(val,next){this.val=(val===undefined?0:val)this.next=(next===undefined?null:next)}}varhasCycle=function(head){letfast=headletslow=headwhile(......
  • LeetCode:83.删除排序链表中的重复元素
    LeetCode:83.删除排序链表中的重复元素classListNode{constructor(val,next){this.val=(val===undefined?0:val)this.next=(next===undefined?null:next)}}vardeleteDuplicates=function(head){letp=head//head......
  • 力扣21、合并两个有序链表
    目录1、题目2、思路3、代码若有错误,欢迎指正! 1、题目将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例1:输入:l1=[1,2,4],l2=[1,3,4]输出:[1,1,2,3,4,4]示例2:输入:l1=[],l2=[]输出:[]示例......
  • 数据结构——单链表(C语言版:超详细)
    目录一、引言1.数据结构的重要性2.单链表在其中的地位二、什么是单链表1.单链表的定义2.基本概念解释三、单链表的结构特点1.与数组对比的优势2.存在的劣势四、单链表的基本操作1.节点的创建2.动态申请一个节点3.插入节点3.1尾插3.2头插3.3在pos之前插入3.4在......
  • 代码随想论算法训练营第3天 | 链表理论基础,203.移除链表元素,707.设计链表,206.反转链表
    一、刷题部分1.1链表理论基础原文链接:代码随想录题目链接:......
  • LeetCode:206.反转链表
    flowchartTDA[开始]-->B{p1是否为空}B-->|No|C[保存p1.next到temp]C-->D[将p1.next指向p2]D-->E[更新p2为p1]E-->F[更新p1为temp]F-->BB-->|Yes|G[返回p2]LeetCode:206.反转链表/***Definitionforsingly-linkedlist.*functionLi......
  • 3.14 BGP路由过滤
    概述:BGP路由可以携各种各样的路由属性,例如PreferredValue属性、LocalPreference属性、ASPath属性、Origin属性、MED属性、NextHop属性、团体属性等。路由属性的丰富性可以为实现路由过滤、路由引入等路由策略和控制提供非常有利的条件。掌握:利用BGP路由的ASPath属性、Com......
  • LeetCode算法题:删除排序链表中的重复元素
    题目描述下面是给定的一段代码 /***Definitionforsingly-linkedlist.*publicclassListNode{*intval;*ListNodenext;*ListNode(){}*ListNode(intval){this.val=val;}*ListNode(intval,ListNodenext){this.val......
  • 23. 合并 K 个升序链表(难)
    目录题目法一:暴力法二:递归+分治法三、找最小题目给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。示例1:输入:lists=[[1,4,5],[1,3,4],[2,6]]输出:[1,1,2,3,4,4,5,6]解释:链表数组如下:[1->4->5,1->3->4,2->6]将它......