删除链表中等于给定值 val 的所有节点
题目描述
给定一个链表的头节点和一个整数值 val,需要删除链表中所有值等于 val 的节点,并返回新的头节点。
算法原理
采用新建链表的方式处理。遍历原链表,将不等于 val 的节点依次尾插到新链表中。这种方法逻辑直观,但需要额外的空间存储新节点。
代码实现
/**
* 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;
ListNode* newtail = NULL;
ListNode* pcur = head;
while (pcur) {
if (pcur->val != val) {
if (newhead == NULL) {
newhead = newtail = pcur;
} else {
newtail->next = pcur;
newtail = pcur;
}
}
pcur = pcur->next;
}
if (newtail) {
newtail->next = NULL;
}
return newhead;
}
反转链表
题目描述
给定一个单链表的头节点,要求反转整个链表并返回新的头节点。
算法原理
使用三指针法逐步反转节点的指向。定义三个指针:n1 指向前驱节点(初始为 NULL),n2 指向当前节点,n3 指向后继节点。在循环中,先将 n2 的 next 指向 n1,然后同步移动 n1 和 n2,最后更新 n3。需要注意链表为空或 n3 为空的边界情况。
代码实现
typedef struct ListNode ListNode;
struct ListNode* reverseList(struct ListNode* head) {
if (head == ) head;
ListNode* n1 = ;
ListNode* n2 = head;
ListNode* n3 = head->next;
(n2) {
n2->next = n1;
n1 = n2;
n2 = n3;
(n3) n3 = n3->next;
}
n1;
}


