深入浅出之链表

深入浅出之链表

文章目录:

一、链表的定义

链表是一种链式存储结构,由多个节点(结点)组成,每个节点包含一个数据元素和一个指向下一个节点的指针。链表中的节点不一定是连续存储的,每个节点的地址可以是随机的。链表的头指针指向链表中的第一个节点,而尾指针则指向链表的最后一个节点。链表有单链表、双向链表等不同类型。相比于数组,链表的优点在于可以动态地增加或删除节点,并且不需要事先分配固定大小的存储空间。

二、单链表

单链表指的是由每个结点都有记录后继。例如一个旅行团,按照一定顺序进入景区,混乱后需要恢复进入景区时候的队列,此时每个人都记得自己身后是谁,这样就能重新组成进入景区时候的顺序队列。

以下以数组的形式来模拟单链表。其中next数组的值代表着该参数后一个的值,当i等于0的时候,表示该队列结束。

cpp 复制代码
#include <iostream>
using namespace std;
int main(){
    int next[10];
    for(int i=1;i!=0;i=next[i]){
        cout<<i;
    }
    return 0;
}

根据以上的代码和定义可知,单链表中,元素和元素之间没有一定的顺序关系,检索的方式为以上一步推出下一步。

当此处的数组换为指针之后,就是真正意义上的链表结构。

三、双链表

双链表指的是由每个结点都有记录前驱和后继。继续以刚才的旅游团为例,这次每个人不仅记得自己身后是谁,也记得自己的前面是谁。这样就能实现链表的前推和回溯功能。

cpp 复制代码
#include <iostream>
using namespace std;
int main(){
    int next[10][2];
    for(int i=1,j=1;i!=0;i=next[i][j]){
        cout<<i;
    }
    return 0;
}

仅需将前一个元素的参数放入二维数组中,区分前驱和后继即可。

四、链表的插入

在数组中插入一个元素并保持原有顺序不变,需要将 n − i n-i n−i个元素向后移动,时间复杂度为 O ( ( n − i ) 2 / 2 ) O((n-i)^2/2) O((n−i)2/2)。在链表中,利用"走一步看一步"的性质,我们将 z z z元素插入到 x x x元素和 y y y元素之间,仅需要把 x x x的后继改为 z z z, z z z的后继改为 y y y即可完成插入。

cpp 复制代码
#include <iostream>
#include <vector>
using namespace std;
int main(){
    vector<int> next(10);
    next[z]=next[x];
    next[x]=z;
    }
    return 0;
}

五、链表的删除

在链表插入的思路中,将 x z y xzy xzy元素中的 z z z元素删除,只需要将 x x x的后继改为 y y y即可实现。

cpp 复制代码
#include <iostream>
#include <vector>
using namespace std;
int main(){
    vector<int> next(10);
    next[x]=next[next[x]];
    }
    return 0;
}

六、一些特殊的链表

1、循环链表:本质为一个单链表,但是尾元素的后继为首元素,形成一个闭环。

2、块链表:将数据压缩后,进行链表排布。

相关推荐
CSharp精选营5 天前
关系型 vs 非关系型:从原理到选型,一文搞定数据库核心分类
数据结构·nosql·关系型数据库·非关系型数据库·技术选型
刘马想放假8 天前
Modbus 全栈技术解析:TCP、RTU、ASCII、RTU over TCP
数据结构·网络协议
北域码匠9 天前
冒泡排序太慢?鸡尾酒排序双向优化,原生 C# 零第三方库完整代码
数据结构·排序算法·泛型·c# 算法·鸡尾酒排序·原生 c# 开发·冒泡排序优化·嵌入式算法
Darling噜啦啦16 天前
列表转树算法深度解析:从 Map 到 Reduce 的两种实现,面试高频考点
数据结构·算法·面试
小小工匠17 天前
Redis - 事务机制:能实现 ACID 属性吗
数据结构·redis·性能优化·并发·持久化
玖玥拾17 天前
C/C++ 数据结构(七)栈、容器适配器
c语言·数据结构·c++··容器适配器
Qres82117 天前
算法复键——树状数组
数据结构·算法
牛油果子哥q17 天前
并查集(DSU)超精讲,路径压缩、按秩合并、万能模板、连通性判定、最小生成树与刷题实战全解
数据结构·c++·最小生成树·并查集
凌波粒17 天前
LeetCode--491.递增子序列(回溯算法)
数据结构·算法·leetcode
疯狂成瘾者17 天前
Java 集合 LinkedList 详解:链表结构、常用方法和队列使用
java·开发语言·链表