链表知识点总结

article/2025/8/25 10:48:51

目录

一、基本概念:

        1.定义:

        2.性质:

        3.链表的分类: 单链表:

双向链表

单链表和双向链表的区别:

双向链表的作用:

循环链表

二、链表的主要操作:

1.插入操作:

        a.重要知识点:

        b.完整代码:

2.删除操作:

        a.重要知识点:

        b.完整代码:

3.查找操作:

        a.完整代码

三、链表和数组的区别

1.存储结构上:

2.操作上:


一、基本概念:

        1.定义:

              链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。每一个结构均含有元素和指向该元素后继结构的指针。

        2.性质:

  • 相连的元素之间通过指针进行链接
  • 最后一个元素的后继指针为NULL
  • 在执行的过程中链表的长度可以增加或者是减少
  • 链表的空间可以按需要进行分配
  • 没有存储空间的浪费,但是链表中的指针需要额外的内存开

        3.链表的分类:
 单链表:

根据下面的单链表结构图可以发现:

 

每个结点除了存储数据data外,还需要记录下个结点的地址,称为后继指针next
单链表有两个特殊的结点,分别是第一个结点——头结点和最后一个结点——尾结点。
头结点:用来记录链表的基地址。
尾结点:尾结点的后继指针指向一个空地址NULL。

双向链表

根据下面的双向链表结构图可以发现:

 

每个结点除了存储数据data外,还会记录上一个结点和下一个结点的地址

单链表和双向链表的区别:

单链表的结点只有一个指向,即后继指针next指向下一个结点。
双向链表的结点有两个指向,一个后继指针next指向下一个结点,还有一个前驱指针prev指向上一个结点。(所以增加了空间的需求,同时也是的插入和删除的开销增加一倍)

双向链表的作用:

        1.使得倒序扫描链表很方便                                                                                                                2.简化了删除操作(原因:可以不再使用一个指向前驱结点的指针)

循环链表

根据下面的循环链表结构图可以发现:

 循环链表的尾结点不指向空,而是指向头结点,类似一个环形结构。

二、链表的主要操作:

  注:如下操作都是基于单链表,其他链表的操作都大差不差。

1.插入操作:

        a.重要知识点:

        1.在表头插入结点的时间复杂度为o(1),在表尾插入结点的时间复杂度为o(n);

        2.核心代码:s->next=p->next;p->next=s;

         注意:链表插入元素的操作必须是先步骤 1,再步骤 2;反之,若先执行步骤 2,除非再添加一个指针,作为插入位置后续链表的头指针,否则会导致插入位置后的这部分链表丢失,无法再实现步骤 1。

        b.完整代码:

//单链表的插入,在链表的第i个位置插入x的元素
/*初始条件:单链表L已存在,1<=i<=ListLength(L)*/
/*在L中第i个位置之前插入新的数据元素e,L的长度加1*/
LinkedList ListInsert(LinkedList L,int i,ElemType x) {LinkedList pre;                      //pre为前驱结点 pre = L;int tempi = 0;for (tempi = 1; tempi < i; tempi++) {pre = pre->next;                 //查找第i个位置的前驱结点 }Node *p;                                //插入的结点为pp = (Node *)malloc(sizeof(Node));p->data = x;             //主要代码p->next = pre->next;          //主要代码pre->next = p;return L;                           
} 

2.删除操作:

 

        a.重要知识点:

               1.核心代码:q=p->next;p->next=q->next;

        b.完整代码:

//单链表的删除,在链表中删除第i个数据元素
/*初始条件:单链表L已存在,1<=i<=ListLength(L)*/
/*操作结果:删除L的第i个数据元素,L的长度减1*/ 
LinkedList ListDelete(LinkedList L,int i)
{LinkedList p,q;                   int j=2; p = L->next;while(p->next&&j<i) {              //查找第i个位置 p=p->next;++j;}if(!(p->next)||j>i)			//第i个元素不存在printf("第i个元素不存在\n");q=p->next;				p->next=q->next;			//将q的后继赋值给p的后继 free(q);                    //释放q结点return L;
} 

3.查找操作:

        从一个具有n个结点的单链表中查找其值等于x的结点时,在查找成功的情况下,需要平均比较(n+1)/2个元素结点。

        a.完整代码

//单链表的查找
/*初始条件:单链表L已存在,1<=i<=ListLength(L)*/
/*操作结果:用e打印中第i个数据元素的值*/ void GetElem(LinkedList L){int i,j=1;		//j为计数器 int *e;LinkedList p;		//声明一结点p printf("请输入查找的位置:");scanf("%d",&i);p=L->next;		//让p指向链表L的第一个结点 while(p&&j<i)        //p不为空且到达i结点{p=p->next;		//让p指向下一个结点 ++j;	}if(!p||j>i)        //链表p为空否则链表长度过短printf("第i个元素不存在");		//第i个元素不存在 *e=p->data;				//取第i个元素的数据 printf("%d\n",*e);}

三、链表和数组的区别

1.存储结构上:

        数组的存储空间是静态的,连续分布的,初始化的过程会造成空间浪费,过小右会是空间溢出的机会增多。
        链表的存储空间是动态分布的,只要内存空间尚有空闲,就不会产生溢出;链表中每个节点除了域值外,还有链域(先一个节点的地址),这样空间利用率会变高。

        数组中的数据在内存中按顺序存储的,而链表是随机存储的!

2.操作上:

       原因:要访问数组中的元素可以按下标索引来访问,速度快,如果对他进行插入操作的话,就得平均要移动一半的节点,所以对数组进行插入操作效率很低!
                   由于链表是随机存储的,链表在插入,删除操作上有很高的效率(相对于数组),如果要访问链表中的某个元素的话,就得从链表的头逐个遍历,直到找到所需要的元素为止,所以链表的随机访问的效率就比数组要低。

注:如果想要博主总结哪一章的知识点或者本章哪里不懂,可以在评论区留言哦!


http://chatgpt.dhexx.cn/article/JVDrmBZU.shtml

相关文章

二级指针实现单链表的插入、删除及 linux内核源码双向链表之奇技

二级指针实现单链表的插入、删除 今天看了coolshell上关于二级指针删除单链表节点的文章。 文章中Linus 举例&#xff1a; 例如&#xff0c;我见过很多人在删除一个单项链表的时候&#xff0c;维护了一个”prev”表项指针&#xff0c;然后删除当前表项&#xff0c;就像这样…

C++实现链表

C实现链表 众所周知&#xff0c;C/C语言实现的链表是由一个一个的结点构成&#xff0c;每个结点分为数据域和指针域&#xff0c;指针域中存储了其后继结点的地址&#xff0c;通过地址来访问下一个结点。 链表是一系列节点串联形成的数据结构&#xff0c;链表存储有序的元素集合…

2130. 链表最大孪生和

地址&#xff1a; 力扣https://leetcode-cn.com/problems/maximum-twin-sum-of-a-linked-list/ 题目&#xff1a; 在一个大小为 n 且 n 为 偶数 的链表中&#xff0c;对于 0 < i < (n / 2) - 1 的 i &#xff0c;第 i 个节点&#xff08;下标从 0 开始&#xff09;的孪…

链表基础【C++实现】

平台&#xff1a;Visual Studio 2022 编程工具&#xff1a;C 目录&#xff1a; 1、链表的结构体实现 2、链表的声明、开辟空间 3、链表的初始化 4、链表的连接 5、链表输出 6、完整代码实例 1、链表的结构体实现 链表由一系列结点&#xff08;链表中每一个元素称为结点&#…

体能修复6-编程-剑指offer-JZ22 链表中倒数最后k个结点

描述 输入一个长度为的链表&#xff0c;设链表中的元素的值为&#xff0c;返回该链表中倒数第个节点。 如果该链表长度小于&#xff0c;请返回一个长度为的链表。 数据范围:&#xff0c;&#xff0c; 要求&#xff1a;空间复杂度&#xff0c;时间复杂度 进阶&#xff1a;空…

Niuke:JZ36.二叉树与双向链表

文章目录 &#xff2e;iuke:JZ36.二叉树与双向链表题目描述示例思路分析代码实现 &#xff2e;iuke:JZ36.二叉树与双向链表 题目描述 描述 输入一棵二叉搜索树&#xff0c;将该二叉搜索树转换成一个排序的双向链表。如下图所示 注意: 1.要求不能创建任何新的结点&#xff0c;…

【C/C++ 数据结构】-链表(OJ题)(4)

文章目录 题一&#xff1a;反转链表法1&#xff1a;指针反向法2&#xff1a;指针翻转法3&#xff1a;头插法 题二&#xff1a;链表的中间节点法1&#xff1a;统计节点减半法法2&#xff1a;快慢指针法 题三&#xff1a;合并两个有序链表法1&#xff1a;tail拼接法法2&#xff1…

链表面试常见考题(C++实现)

链表面试常见考题&#xff08;C实现&#xff09; 常用方法&#xff1a;画图法 常用技巧&#xff1a;用于遍历搜索的游标 ListNode* cur; 用于返回值的哑节点 ListNode* dumny new ,, 单链表更新先去考虑他的next指向问题。链表元素或者边界问题可以用前继节点pre、后继节点…

剑指offer(C++)-JZ22:链表中倒数最后k个结点(数据结构-链表)

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 题目描述&#xff1a; 输入一个长度为 n 的链表&#xff0c;设链表中的元素的值为 ai &#xff0c;返回该链表中倒数第k个节点。…

单链表(带头结点)的存储结构与基本操作(c语言)------亲测可用

编程语言&#xff1a;c语言 编译环境&#xff1a;Dev-c 实现功能&#xff1a;实现功能&#xff1a;单链表&#xff08;带头结点&#xff09;结点结构体的定义&#xff0c;单链表&#xff08;带头结点&#xff09;初始化、求元素个数、插入元素、删除元素、取元素、打印所有元素…

链表OJ归纳总结 ------- C语言

一、移除链表元素 OJ链接https://leetcode.cn/problems/remove-linked-list-elements/submissions/ 1.1. | 解题思路 | 创建一个新的哨兵头节点 guard&#xff0c;创建尾节点 tail&#xff0c;创建 cur 用于遍历原链表数据。 对原链表进行遍历&#xff0c;若 cur->val ! v…

【链表复习】C++ 链表复习及题目解析 (2)

目录 牛客 CM11 链表分割 牛客 OR36 之链表的回文结构 Leetcode 160. 相交链表 LeetCode 141. 环形链表 LeetCode 138. 复制带随机指针的链表 本文继续延续前文&#xff0c;为大家带来几道经典的链表中等难度的题目。 牛客 CM11 链表分割 现有一链表的头指针 ListNode* p…

【链表OJ题(三)】链表中倒数第k个结点

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;数据结构 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录 链表OJ题(三)1. 链表…

【20230205】链表小结

链表&#xff08;list&#xff09; 链表是一种通过指针串联在一起的线性结构&#xff0c;每一个节点由两部分组成&#xff0c;一个是数据域一个是指针域&#xff08;存放指向下一个节点的指针&#xff09;&#xff0c;最后一个节点的指针域指向null&#xff0c;链表的入口节点称…

【链表复习】C++ 链表复习及题目解析 (3)

目录 剑指offer 中的链表题目 JZ6 从尾到头打印链表 JZ18 删除链表的结点 JZ24 反转链表 JZ25 合并两个排序的链表 JZ52 两个链表的第一个公共结点 JZ23 链表中环的入口结点 JZ22 链表中倒数第k 个结点 JZ35 复杂链表的复制 JZ76 删除链表中重复的结点 本次给大家带来…

【023】C/C++数据结构之链表及其实战应用

C 链表及其实战应用 引言一、链表的概述二、利用链表设计一个学生管理系统2.1、设计主函数main()2.2、实现插入节点2.3、实现链表的遍历2.4、实现链表的查找2.5、实现删除某个节点2.6、实现释放链表2.7、完整代码 总结 引言 &#x1f4a1; 作者简介&#xff1a;专注于C/C高性能…

KNN分类算法详解

参考&#xff1a;https://www.cnblogs.com/listenfwind/p/10311496.html https://www.cnblogs.com/listenfwind/p/10685192.html 1. 概述 KNN 可以说是最简单的分类算法之一&#xff0c;同时&#xff0c;它也是最常用的分类算法之一。注意&#xff1a;KNN 算法是有监督学习中的…

【python代码实现】朴素贝叶斯分类算法

目录 前置知识1、概念2、算法原理2.1、条件概率2.2、全概率2.3、先验概率2.4、后验概率 朴素贝叶斯分类算法1、构建数据集2、分类概率3、条件概率4、先验概率 前置知识 1、概念 上一篇我们讲到的决策树算法&#xff0c;是反映了一种非常明确、固定的判断选择过程&#xff0c;…

分类算法-KNN(原理+代码+结果)

KNN&#xff0c;即K最邻近算法&#xff0c;是数据挖掘分类技术中比较简单的方法之一&#xff0c;简单来说&#xff0c;就是根据“最邻近”这一特征对样本进行分类。 1、K-means和KNN区别 K-means是一种比较经典的聚类算法&#xff0c;本质上是无监督学习&#xff0c;而KNN是分…

伯努利贝叶斯分类算法

贝叶斯分类的核心概念&#xff1a; 我们对某件事情的判断首先有一个概率&#xff0c;这个概率称为先验概率。先验概率时根据经验总结出来的概率值&#xff0c;如果首先没有经验&#xff0c;那么可以将先验概率设置为50%&#xff0c;随着后面事情的发展&#xff0c;再调整先验概…