数据结构(单链表,双链表)

Posted 芜湖之肌肉金轮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构(单链表,双链表)相关的知识,希望对你有一定的参考价值。

单链表——数组模拟

单链表如果是用结构体去实现的话,需要一个指针域,和一个值域(最简单的单链表)一个指向下一个值的位置所在,一个储存当前的值

受此启发,我们也可以用数组对其进行模拟,用关联起来——我们可能回想这么做是否还有存在的必要,因为像c++的STL里面都是已经写好的,或者struct写不是更好?emmm确实如此,但是拿c++举例,c++的new其实是很慢的,所以用数组会更快(手写STL也是同理)

那么根据刚才的分析我们已经知道了我们需要什么了:

1.值域:e【n】。

2.指针域:next【n】。

 next里面储存下一个结点的下标。

好了,我们可以开始进行一个简单的链表的书写了。

void init()
{
    head=-1;//初始化头结点
    idx=0;//记录我们用到了哪个下标
}

 先初始化头结点,并用idx储存用到的下标

1.插入—头插法(插在头结点后面)

 让新结点指向head(head所存的就是第一个结点的下标(也就是地址)),让head指向新节点。

void add_head(int x)
{
    e[idx]=x;
    ne[idx]=head;
    head=idx++;
}

 1.插入—插到第k个插入的点的后面

由于我们的idx是记录用到的下标的值,但是我们的idx是从0开始的,所以第k个插入的数对应的就是k-1。

void add(int k,int x)
{
    e[idx]=x;
    ne[idx]=ne[k-1];
    ne[k-1]=idx++;
}

 

 那么插入是这么插入的,怎么删除呢?

1.删除

同理删除第k个结点其实是删除k-1。因为我们的idx是从0开始的

 

void remove(int k){
    ne[k-1]=ne[ne[k-1]];
}

好了以上就是单链表的增加和删除,那么增删会了,怎么查呢?(会查就会改了哈哈哈)

很简单:

for(int i=head,i!=-1;i=ne[i])
{
    e[i]...
    ...
    ...
    ...
}

 

双链表——数组模拟

双链表其实就是在单链表上又增加了一层指针域,也就是前向的指针。

void init()
{
    r[0]=1;
    l[1]=0;
    idx=2;
}

1插入——头插法

void add_head(int x)
{
    l[idx]=0;//新节点->pre=head
    r[idx]=r[0];//新节点->next=head->next
    r[0]=idx;//head->next=新节点
    l[r[idx]]=idx;//新节点->next->pre=新节点
    e[idx++]=x;//add x
}

 

 2插入——尾插法

void add_tail(int x)
{
    r[idx]=1;//新节点->next=tail
    l[idx]=l[1];//新节点->pre=tail->pre
    r[l[1]]=idx;//新节点->pre->next=新节点
    l[1]=idx;//tail->pre=新节点
    e[idx++]=x;//add x
}

 删除

void delete_(int k)
{
    r[l[k]]=r[k];//k->pre->next=k->next
    l[r[k]]=l[k];//k->next->pre=k->pre
}

 在第k个点后插入也是和头插法和尾插法同理。

来源acwing

 

以上是关于数据结构(单链表,双链表)的主要内容,如果未能解决你的问题,请参考以下文章

C/C++语言数据结构快速入门(代码解析+内容解析)链表(单链表,双链表,循环链表,静态链表)

循环链表(循环单链表循环双链表)的相关操作的代码实现(C语言)

数据结构单链表,双链表,数组的底层实现原理

数据结构[双链表的实现,以及双链表和单链表之间的比较,链表和顺序表的优劣]

#yyds干货盘点# 数据结构与算法之双链表

[每日算法220508] 单链表和双链表的反转