数据结构实战:双向链表核心实现与算法解析
基于前文对双向链表概念的介绍,本节重点实现其余核心功能,包括查找、插入(前后)、删除操作,并对比顺序表与链表的差异。最后通过两道经典算法题巩固指针操作逻辑。
一、实现双向链表
1. 双向链表查找
双向链表的查找操作与单链表类似,但可利用创建临时指针实现遍历。由于是循环双向链表,需注意终止条件。
函数原型:
ListNode* LTFind(ListNode* h, type x);
实现逻辑:
ListNode* LTFind(ListNode* h, type x) {
if (LTEmpty(h)) {
return NULL;
}
ListNode* p = h->next;
while (p != h) {
if (p->data == x) {
return p;
}
p = p->next;
}
return NULL;
}
这里通过遍历判断,找到目标数据返回节点地址,未找到则返回 NULL。
2. 双向链表在指定位置插入
分为在指定节点之后插入和在指定节点之前插入两种情况。
在指定位置之后插入
该函数用于在节点 pos 之后插入新节点。核心在于调整指针关系,防止断链。
函数原型:
void LTInsert(ListNode* pos, type x);
实现细节:
void LTInsert(ListNode* pos, type x) {
assert(pos);
ListNode* p = pos->next;
ListNode* newnode = LTcreat(x);
pos->next = newnode;
newnode->prev = pos;
newnode->next = p;
p->prev = newnode;
}
注意: 必须先保存原后继节点 p,否则 pos->next 更新后会丢失后续链表。插入顺序也很关键,先连后,再连前,避免覆盖指针。
在指定位置之前插入
需要在 pos 的前驱位置插入,这通常需要先找到 pos 的前驱节点。
函数原型:
void LTInsertfront;


