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

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语言中特殊结构类型“双链表”

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

双链表与单链表的比较

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

(王道408考研数据结构)第二章线性表-第三节3:循环单链表和循环双链表

数据结构学习之双链表基本操作