本文是个人学习笔记,素材来自青岛大学王卓老师的教学视频。
一方面用于学习记录与分享,另一方面是想让更多的人看到这么好的《数据结构与算法》的学习视频。
如有侵权,请留言作删文处理。
课程视频链接:
数据结构与算法基础–第04周03–2.5.4双向链表1
📚 📌 📝 🔍 ⚠️ 😊 ⭐ 🔗 👋 ❓ 💬 🔹 🔸 🔖 ❗️ 💟 ➔
📚 【Week04】03_双向链表
❓ 为什么要讨论双向链表
双向链表
双向链表的结构可定义如下
typedef struct DoubleNode{
Elemtype data;
struct DoubleNode *prior, *next;
}DoubleNode, *DoubleLinkList;
单循环双向链表的结构示意图如下
双循环双向链表的结构示意图如下
和单链的循环表类似,双向链表也可以有循环表
(1) 让头结点的前驱指针指向链表的最后一个结点。
(2) 让最后一个结点的后继指针指向头结点。
双向循环链表结构的对称性(设指针 p 指向某一结点)
p->prior->next = p = p->next->prior;
结点 b 的前驱结点的后继结点是它本身,结点 b 的后继结点的前驱结点是它本身。
所以,在双向循环链表中,查找某一结点可以通过该节结点的前驱结点或该结点的后驱结点找到。
在双向链表中,有些操作(如:ListLength、GetElem 等),因仅涉及一个方向的指针,
故它们的算法与线性链表的相同。
但在插入、删除时,则需同时修改两个方向上的指针,两者的操作的时间复杂度均为O(n)。