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)

相关推荐
Q741_1472 分钟前
C++ 分治 快速选择算法 堆排序 TopK问题 力扣 215. 数组中的第K个最大元素 题解 每日一题
c++·算法·leetcode·分治·1024程序员节·topk问题·快速选择算法
文火冰糖的硅基工坊7 分钟前
[人工智能-大模型-57]:模型层技术 - 软件开发的不同层面(如底层系统、中间件、应用层等),算法的类型、设计目标和实现方式存在显著差异。
人工智能·算法·中间件
鱼儿也有烦恼11 分钟前
快速学完 LeetCode top 1~50 [特殊字符]
java·算法·leetcode·1024程序员节
独自破碎E13 分钟前
LeetCode 380: O(1) 时间插入、删除和获取随机元素
java·算法·leetcode
Brookty22 分钟前
【算法】前缀和(二)使用
java·学习·算法·前缀和·动态规划·1024程序员节
不良人龍木木36 分钟前
云图-地基云图
图像处理·算法·计算机视觉·1024程序员节
RTC老炮37 分钟前
webrtc弱网-PccNetworkController类源码分析与算法原理
网络·算法·webrtc
Swift社区44 分钟前
LeetCode 406 - 根据身高重建队列
算法·leetcode·1024程序员节
敲上瘾1 小时前
背包dp——动态规划
c++·算法·动态规划
京东零售技术1 小时前
大模型时代的广告营销变革与实践
算法