数据结构:链表核心算法实战解析
链表操作是检验指针掌握程度的试金石,也是面试中的高频考点。本文通过七道 LeetCode 经典题目,演示了哨兵节点、双指针、快慢指针及节点穿插复制等核心技巧。代码采用 C 语言实现,注重边界条件与内存管理,适合巩固底层数据结构基础。
203. 移除链表元素
这道题的核心在于处理头结点可能也需要被删除的情况。直接修改原链表指针比较麻烦,我们可以构建一个新的链表结构,或者使用哨兵节点简化逻辑。下面的实现采用了尾插法构建新链表的方式,逻辑清晰且不易出错。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
typedef struct ListNode ListNode;
struct ListNode* removeElements(struct ListNode* head, int val) {
ListNode* newHead = NULL, *newTail = NULL;
ListNode* pcur = head;
while (pcur != NULL) {
if (pcur->val != val) {
if (newHead == NULL) {
// 将新链表的头尾指针指向当前节点
newHead = newTail = pcur;
} else {
newTail->next = pcur;
newTail = newTail->next;
}
}
pcur = pcur->next;
}
if (newTail != NULL) {
newTail->next = NULL; // 断开尾部连接
}
return newHead;
}
206. 反转链表
反转链表是链表操作的入门必考题。关键在于维护三个指针:前驱 prev、当前 cur 和后继 next。在遍历过程中,我们需要先保存后继节点,再修改当前节点的指向,最后移动指针。注意循环结束后的返回值是 prev,因为它最终指向新的头结点。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* reverseList(struct ListNode* head) {
;
head;
(cur) {
cur->next;
cur->next = prev;
prev = cur;
cur = next;
}
prev;
}


