⭐️ 题目描述
🌟 leetcode链接:移除链表元素
1️⃣ 代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
/*
思路1:遍历链表,同时用另一个指针记录当前结点的上一个结点。如果是要删除的元素
那么就 free 当前结点,再把当前结点的上一个结点链接到当前结点的下一个结点。
*/
struct ListNode* removeElements(struct ListNode* head, int val){
struct ListNode * cur = head;
struct ListNode * prev = NULL;
while (cur != NULL) {
if (cur->val == val) {
// 当前结点是要删除的结点
// 特殊情况:第一个就是要删除的元素,但是prev为NULL
if (cur == head) {
head = cur->next;
free(cur);
cur = head;
} else {
prev->next = cur->next;
free(cur);
cur = prev->next;
}
} else {
// 迭代往后走
prev = cur;
cur = cur->next;
}
}
return head;
}
2️⃣ 代码:
/*
思路2:把不是要删除的元素,尾插到一个新链表中。如果是要删除的元素 free 释放,继续迭代。(采用哨兵卫的头)
*/
struct ListNode* removeElements(struct ListNode* head, int val){
// 哨兵卫
struct ListNode* newHead = (struct ListNode *)malloc(sizeof(struct ListNode));
newHead->next = NULL;
struct ListNode* tail = newHead;
// 遍历链表
struct ListNode * cur = head;
while (cur != NULL) {
if (cur->val == val) {
struct ListNode* next = cur->next;
free(cur);
cur = next;
} else {
tail->next = cur;
tail = cur;
cur = cur->next;
}
}
// 特殊情况:如果最后一个结点是删除的元素,释放掉当前元素,上一个元素的 next 还指向当前释放的元素。
// 造成野指针问题
tail->next = NULL;
// 释放
head = newHead->next;
free(newHead);
return head;
}