LeetCode 0203. 移除链表元素

发布于:2023-01-12 ⋅ 阅读:(225) ⋅ 点赞:(0)

【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(相当于往后继续遍历)

🌹

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

AC代码

C++

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

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到