当前位置:首页 » 网络管理 » 双链表为什么插入删除方便
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

双链表为什么插入删除方便

发布时间: 2023-01-19 03:19:37

Ⅰ 双向链表相比单链表的优势

从结构上来看,双向链表可以支持 O(1) 时间复杂度的情况下找到前驱结点,双向链表在某些情况下的插入、删除等操作都要比单链表简单、高效。
你可能会说,我刚讲到单链表的插入、删除操作的时间复杂度已经是 O(1) 了,双向链表还
能再怎么高效呢?其实说单链表插入、删除操作的时间复杂度为O(1)是不准确的,或者说是有先决条件的。

我们先来看删除操作。
在实际的软件开发中,从链表中删除一个数据无外乎这两种情况:

对于第一种情况,不管是单链表还是双向链表,为了查找到值等于给定值的结点,都需要从
头结点开始一个一个依次遍历对比,直到找到值等于给定值的结点,然后将其删除。
尽管单纯的删除操作时间复杂度是 O(1),但遍历查找的时间是主要的耗时点,对应的时间复杂度为 O(n)。根据时间复杂度分析中的加法法则,删除值等于给定值的结点对应的链表操作的总时间复杂度为 O(n)。

对于第二种情况,我们已经找到了要删除的结点,但是删除某个结点 q 需要知道其前驱结点,而单链表并不支持直接获取前驱结点,所以,为了找到前驱结点,我们还是要从头结点开始遍历链表,直到 p->next=q,说明 p 是 q 的前驱结点。

但是对于双向链表来说,这种情况就比较有优势了。因为双向链表中的结点已经保存了前驱结点的指针,不需要像单链表那样遍历。所以,针对第二种情况,单链表删除操作需要O(n) 的时间复杂度,而双向链表只需要在 O(1) 的时间复杂度内就搞定了!
同理,如果我们希望在链表的某个指定结点前面插入一个结点,双向链表比单链表有很大的优势。双向链表可以在 O(1) 时间复杂度搞定,而单向链表需要 O(n) 的时间复杂度。

除了插入、删除操作有优势之外,对于一个有序链表,双向链表的按值查询的效率也要比单链表高一些。 因为,我们可以记录上次查找的位置 p,每次查询时,根据要查找的值与 p的大小关系,决定是往前还是往后查找,所以平均只需要查找一半的数据。

Ⅱ l数据结构~~双链表的实现

双链表
1、双向链表(Doubly
Linked
List)
双(向)链表中有两条方向不同的链,即每个结点中除next域存放后继结点地址外,还增加一个指向其直接前趋的指针域prior。
注意:
①双链表由头指针head惟一确定的。
②带头结点的双链表的某些运算变得方便。
③将头结点和尾结点链接起来,为双(向)循环链表。
2、双向链表的结点结构和形式描述
①结点结构(见上图a)
②形式描述
typedef
struct
dlistnode{
DataType
data;
struct
dlistnode
*prior,*next;
}DListNode;
typedef
DListNode
*DLinkList;
DLinkList
head;
3、双向链表的前插和删除本结点操作
刻画双链表结构的对称性的语句:p→prior→next==
p→next→prior;由于双链表的对称性,在双链表能能方便地完成各种插入、删除操作。
①双链表的前插操作
void
DInsertBefore(DListNode
*p,DataType
x)
{//在带头结点的双链表中,将值为x的新结点插入*p之前,设p≠NULL
DListNode
*s=malloc(sizeof(DListNode));//①
s->data=x;//②
s->prior=p->prior;//③
s->next=p;//④
p->prior->next=s;//⑤
p->prior=s;//⑥
}
②双链表上删除结点*p自身的操作
void
DDeleteNode(DListNode
*p)
{//在带头结点的双链表中,删除结点*p,设*p为非终端结点
p->prior->next=p->next;//①
p->next->prior=p->prior;//②
free(p);//③
}
注意:
与单链表上的插入和删除操作不同的是,在双链表中插入和删除必须同时修改两个方向上的指针。
上述两个算法的时间复杂度均为O(1)。

Ⅲ 判断题:双向链表结构比顺序存储结构在“插入”和“删除”数据操作上更为方便。

正确。

因为双向链接插入、删除时只需要修改前后几个节点的链接即可。
而顺序存储结构如数组,插入时需要将其后所有数据后移一位以腾出空位,删除时需要将其后所有数据前移一位以消去空位。
综上,正确。

Ⅳ 使用双链表存储数据的优点是什么

可以在当前结点前后随意插入删除,插入删除结点时间短,不必预估存储空间,没有空间溢出,很方便进行向后继和向前驱的双向遍历

Ⅳ 说链表较于顺序表的优势有一个是便于插入和删除,链表时间复杂度也是O(n),(若要对最后一个数进行操作

链表的插入和删除之所以是o(n),是因为要用o(n)顺序查找到插入点的位置,插入时间为o(n)
顺序表找到插入点的时间为o(1),但要把后面的元素全部后移一位,复杂度为o(n)。
查找所需时间比移动短多了,所以虽然复杂度都是o(n),但是链表更适合插入删除

Ⅵ 如果一个链表最常用的操作是在末尾插入节点和删除尾节点,为什么选用带头节点的双循环链表最省时间

链表最常用的操作是在末尾插入节点和删除尾节点,在尾巴插入 删除操作:
都需要知道他的前导 而单链表要查找到最有一个元素需要遍历全部链表
双链表直接可以查到前导;
最常用的操作实在最后一个元素之后插入一个元素和删除第一个元素
删除头结点 需要头指针 或者只用一个->next域就能查到 速度就快了
在有第二个条件 删除最后一个元素 有尾指针就最好了 可以直接找到尾巴元素 同时他还是循环链表 ->next就是头结点。
链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相比于线性表顺序结构,操作复杂。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而线性表和顺序表相应的时间复杂度分别是O(logn)和O(1)。