leetcode-代码随想录-链表-移除链表元素

题目

链接:203. 移除链表元素 - 力扣(LeetCode)

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

复制代码
输入:head = [1,2,6,3,4,5,6], val = 6
输出:[1,2,3,4,5]
c++ 复制代码
class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        
    }
};
思路 & 代码
  1. 由于要删除的节点可能是头节点,所以为了方便采用 虚拟头节点 的方法来移除元素。
  2. 设置虚拟头节点:ListNode* dummyHead = new ListNode(0);
  3. 移除元素:找到目标val节点 的前一个节点 cur,将其指向下下一个节点cur->next = cur->next->next
  4. 释放被移除元素的内存

注意点: 在判断cur->nextcur->val时,要先判断cur不为空,否则就是报空指针错误

c++ 复制代码
#include <iostream>
using namespace std;

struct ListNode {
    int val;
    ListNode *next;
    ListNode() : val(0), next(nullptr) {}
    ListNode(int x) : val(x), next(nullptr) {}
    ListNode(int x, ListNode *next) : val(x), next(next) {}
};

class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        ListNode* dummyhead = new ListNode(0);
        dummyhead->next = head;
        ListNode* cur = dummyhead;
        while(cur->next != nullptr){
            if(cur->next->val == val){
                ListNode* temp = cur->next;
                cur->next = cur->next->next;
                delete temp;
            }else{
                cur = cur->next;
            }
        }
        head = dummyhead->next;
        delete dummyhead;
        return head;
    }
};

void printLinkedList(ListNode* head){
    ListNode* cur = head;
    while(cur != nullptr) {
        cout << cur->val << " ";
        cur = cur->next;
    }
    cout << endl;
}

int main() {
    
    int n, m;
    ListNode* dummyHead = new ListNode(0);
    while(cin >> n){
        if(n == 0){
            cout << "list is empty" << endl;
            continue;
        }

        ListNode* cur = dummyHead;

        while(n--){
            cin >> m;
            ListNode* newNode = new ListNode(m);
            cur->next = newNode;
            cur = cur->next;
        }
    }

    ListNode* head = dummyHead->next;
    delete dummyHead;
    printLinkedList(head);

    int val = 6;
    Solution obj;
    ListNode* result = obj.removeElements(head,val);
	
    printLinkedList(result);
}

时间复杂度: O(n)

空间复杂度: O(1)

相关推荐
还有多久拿退休金2 小时前
让飞书知识库跟着 commit 自己长:一套自动化知识库的真实实现
前端·算法·架构
KaMeidebaby3 小时前
卡梅德生物技术快报|小 RNA 适配体合成 + 多方法亲和力表征全流程标准化操作手册
前端·网络·数据库·人工智能·算法
是Dream呀3 小时前
基于深度学习的人类行为识别算法研究
人工智能·深度学习·算法
happyprince4 小时前
03_NVIDIA_ModelOpt-量化算法深入
人工智能·深度学习·算法
大鱼>4 小时前
AI+货物追踪:智能快递柜追踪系统
人工智能·深度学习·算法·机器学习
researcher-Jiang5 小时前
算法训练:堆 & 可并堆
算法
在书中成长5 小时前
HarmonyOS 小游戏《对战五子棋》开发第18篇 - 棋盘设计
算法·harmonyos
Frostnova丶5 小时前
(12)LeetCode 76. 最小覆盖子串
算法·leetcode·职场和发展
灯澜忆梦5 小时前
GO_函数_1
算法
言乐65 小时前
Python实现建造微服务商城后台
开发语言·python·算法·微服务·架构