双向链表(C++数组实现)

概念

双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。(百度)

操作(以下红边为新加入的边,黑边为删除的边)

题外话- -由于窝不会用链表,所以才用数组实现的
用一个pre数组存储每一个节点的前驱(即前一个节点),next数组存储每一个节点的后驱(即后一个节点)。

删点

现在要将x节点删掉(如下图)。我们知道了x = pre [z] = next [y] , y = pre[x] , z = next[x]
。其实只用将 y 节点的 next(即y的后驱) 改为 z ,和 z 节点的 pre(即z的前驱) 改为 y 即可。
代码:

int a=pre[x],b=next[x];
next[a]=b,pre[b]=a;

双向链表(C++数组实现)_第1张图片

加点

现在要将x加到y和z之间(如下图)。我们知道了y = pre[z] , z = next[y] 。现在要将 ynext(即y的后驱) 修改为 x ,将 zpre(即z的前驱) 改为 x , 将新加入的x的pre(前驱)记录为y,next(后驱)记录为z即可。
代码:

next[y]=x,pre[z]=z;
pre[x]=y,next[x]=z;

双向链表(C++数组实现)_第2张图片

最后的说明

以上只是双向链表的两个基本操作,并且也没有特殊处理首尾节点- -循环链表- -的信息,因为窝太懒了本篇文章只是简单介绍一下双向链表的操作,循环部分的处理也不麻烦。如有不足,请谅解窝是个菜鸡,最好能在评论区指出错误,谢谢!

你可能感兴趣的:(数据结构,图论,数据结构,c++,链表)