203.移除链表元素

【LetMeFly】203.移除链表元素:添加临时头节点以便操作

力扣题目链接:https://leetcode.cn/problems/remove-linked-list-elements/

给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点

 

示例 1:

输入:head = [1,2,6,3,4,5,6], val = 6
输出:[1,2,3,4,5]

示例 2:

输入:head = [], val = 1
输出:[]

示例 3:

输入:head = [7,7,7,7], val = 7
输出:[]

 

提示:

  • 列表中的节点数目在范围 [0, 104]
  • 1 <= Node.val <= 50
  • 0 <= val <= 50

方法一:添加临时头节点以便操作

这个解法的思路是,添加一个临时头节点,并把临时头节点的next指向原始头节点。这样,就避免了删除头节点的麻烦操作。之后遍历并删除值为val的节点。最后,返回临时头节点的下一个节点即可。

具体遍历删除方法为:

使用两个指针,last指向上一个元素,current指向当前遍历到的元素。(初始值current = head,相应地,last = 临时头节点

之后在当前指针current不为空时:

  • 如果current的值恰好等于val,那么就让lastnext指向currentnext,并将current指向currentnext(相当于删除了current
  • 否则,将last指向current,并将current指向currentnext(相当于往后继续遍历)

:rose:

  • 时间复杂度$O(n)$,其中$n$是链表节点个数
  • 空间复杂度$O(1)$

AC代码

C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
ListNode* ansHead = new ListNode;
ansHead->next = head;
ListNode* last = ansHead, *current = ansHead->next;
while (current) {
if (current->val == val) {
last->next = current->next;
// delete current; // Here should delete actually
current = current->next;
}
else {
last = current;
current = current->next;
}
}
// ListNode* head = ansHead;
// delete head;
return ansHead->next;
}
};

同步发文于CSDN,原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/126417421


203.移除链表元素
https://blog.letmefly.xyz/2022/08/19/LeetCode 0203.移除链表元素/
作者
Tisfy
发布于
2022年8月19日
许可协议