LeetCode上第203号问题:Remove Linked List Elements
题目
删除链表中等于给定值 val 的所有节点。
示例:
输入: 1->2->6->3->4->5->6, val = 6
输出: 1->2->3->4->5
解题思路
主要考察了基本的链表遍历和设置指针的知识点。
定义一个虚拟头节点dummyHead
,遍历查看原链表,遇到与给定值相同的元素,将该元素的前后两个节点连接起来,然后删除该元素即可。
动画演示
动画演示GIF有点大,请稍微等待一下加载显示^_^
参考代码
代码一
1// 203. Remove Linked List Elements
2// https://leetcode.com/problems/remove-linked-list-elements/description/
3// 使用虚拟头结点
4// 时间复杂度: O(n)
5// 空间复杂度: O(1)
6class Solution {
7public:
8 ListNode* removeElements(ListNode* head, int val) {
9
10 // 创建虚拟头结点
11 ListNode* dummyHead = new ListNode(0);
12 dummyHead->next = head;
13
14 ListNode* cur = dummyHead;
15 while(cur->next != NULL){
16 if(cur->next->val == val){
17 ListNode* delNode = cur->next;
18 cur->next = delNode->next;
19 delete delNode;
20 }
21 else
22 cur = cur->next;
23 }
24
25 ListNode* retNode = dummyHead->next;
26 delete dummyHead;
27
28 return retNode;
29 }
30};
代码二
用递归来解。
通过递归调用到链表末尾,然后回来,需要删的元素,将链表next指针指向下一个元素即可。
1class Solution {
2public:
3 ListNode* removeElements(ListNode* head, int val) {
4 if (!head) return NULL;
5 head->next = removeElements(head->next, val);
6 return head->val == val ? head->next : head;
7 }
8};
执行结果
我们会在每天早上8点30分准时推送一条LeetCode上的算法题目,并给出该题目的动画解析以及参考答案,每篇文章阅读时长为五分钟左右。
HELLO,小伙伴
长按二维码就可以关注我们拉!