双向链表的一些操作

一、插入操作(insert)
(一)基本原理
双链表就好像是手拉手站成一排的人,每个人的右手(next)拉着下一个人,左手(prior)拉着前一个人,每两个人之间有两支手互联.插入操作实际是向队伍中增加人员,他需要拉上左右两边的人,即共三个人要发生关系,由于每两个人之间有两支手互联,所以要发生4次操作.如已知节点
q,p,需插入s,(称为原型吧).
----------------------------------
q->next
--->
q p
<---
p->prior
---------------------------------
现在假设需插入节点s,则需进行以下4次操作:
-----------------------------------------
(1)(2)完成q与s的握手
(1) q->next = s;
(2) s->prior = q;
q->next
--->
q s
<---
s->prior
-----------------------------------------
(3)(4)完成s与p的握手

(3) s->next = p;
(4) p->prior = s;
q->next s->next
---> --->
q s p
<--- <---
s->prior p->prior
-------------------------------------------
对于本文的案例,是原型的变种, 只已知节点p,而不知节点q,但通过双向链表的性质我们可以再初始时(插入前)得到以下关系:
p->prior = q;
所以对于以上的4次操作我们可以作等效替换,即将q 换为 p->prior,则以上4次操作为:
(1) p->prior->next = s;
(2) s->prior = p->prior; file://(1)(2)完成q与s的握手
(3) s->next = p;
(4) p->prior = s; file://(3)(4)完成s与p的握手
(二)互换问题
由于不知道q节点,因此用p->prior来代替,所以p->prior的值应当在已经不再使用q节点的时候再改变,由原型:
(1) q->next = s;
(2) s->prior = q;
(3) s->next = p;
(4) p->prior = s;
(4)改变了p->prior的值,而(1)(2)需使用q,所以(4)应当在(1)(2)后。

二、删除操作(insert)
(一)基本原理
删除操作就好像某个人退出队伍,但退出前他需要让他两边的人把手拉上,以保持队伍的连续性,也好像离职前要把工作要交接好,就好像我现在,哈...,如已知q,s,p, 需删除s,由于只需两个人发生关系,所以需进行以下两次操作:
(1) q->next = p;
(2) p->prior = q;
q->next s->next
---> --->
q s p
<--- <---
s->prior p->prior

q->next
--->
q p
<---
p->prior
对于本例,是上面原型的变种,只已知s,但由双向链表的性质,我们可以推出以下关系:
q == s->prior;
p == s->next;
因此可做以下替换:
(1) s->prior->next = s->next;
(2) s->next->prior = s->prior;
由于s ,以及prior和next的值在两次操作中并没有被改变,因此(1)(2)的顺序没有关系.
三、一些结论
(1)对于双向链表的插入,只需知道插入位置的一个节点即可完成插入;
(2)对于双向链表的删除,只需知道删除节点即可完成删除。
因此对于双向链表的插入和删除在该情况下,时间度为O(1)。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Linux内核中,双向链表是一种特殊的数据结构,它的设计初衷是为了解决不同数据类型作为链表数据节点对函数接口和封装的影响。具体操作双向链表的方法可以通过以下步骤实现: 1. 定义链表节点结构体:在使用双向链表之前,需要先定义链表节点的结构体。这个结构体中需要包含一个前驱指针和一个后继指针,用来连接其他节点。 2. 初始化链表头:在使用链表之前,需要先初始化链表头。链表头是一个特殊的节点,它不存储具体的数据,只是一个用来指向链表的起始位置的指针。 3. 插入节点:要在链表中插入一个新的节点,需要先将新节点的前驱指针和后继指针指向正确的位置,然后将原来的前驱节点和后继节点的指针指向新节点。 4. 删除节点:要从链表中删除一个节点,需要将要删除节点的前驱节点的后继指针指向要删除节点的后继节点,将要删除节点的后继节点的前驱指针指向要删除节点的前驱节点。 5. 遍历链表:要遍历整个链表,可以从链表头开始,一直沿着后继指针向后遍历,直到到达链表尾部。 这些是操作Linux双向链表的一些基本方法,使用这些方法可以进行链表的插入、删除和遍历等操作。同时,Linux内核中还提供了一些宏定义和函数来更方便地操作双向链表,比如container_of宏可以通过节点指针获取节点所在的结构体指针。 参考文献: linux 内核双向链表文件 首先介绍下双向链表的相关知识,最后有实战代码 container_of的定义在linux内核include/linux/kernel.h中<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [linux源码内核双向链表文件](https://download.csdn.net/download/qq_18376583/86770056)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [linux 双向链表详解](https://blog.csdn.net/kksc1099054857/article/details/121717238)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值