首页 > 其他分享 >【LeetCode】203. 移除链表元素

【LeetCode】203. 移除链表元素

时间:2023-05-27 18:33:21浏览次数:46  
标签:结点 ListNode cur val 203 next 链表 移除 head

203. 移除链表元素

image-20230515202434736

思路一:直接删除法(迭代)

1.从头结点开始向后遍历,找到等于val的结点;

2.假设cur->val = val,那么要让cur的前一个结点prevnext指针指向cur的下一个结点,即prev->next = cur->next

要注意的是当头结点的值等于val时(head->val = val),因为头节点没有前一个结点,所以可以通过直接改变头节点使其指向头节点的下一个结点(head = head->next)。 image.png

代码如下:

class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        //当头节点为val时,将头结点向后移动
        while(head && head->val == val) 
        {
            ListNode* tmp = head;//新建一个结点方便删除结点
            head = head->next;
            delete tmp;
        } 
        //判断链表是否为空
        if(head == nullptr)
        {
            return nullptr;
        }
        ListNode* cur = head;//记录当前结点
        ListNode* prev = head;//记录上一个结点
        while(cur)
        {
            if(cur->val == val)//当结点值和val相等时删除
            {
                prev->next = cur->next;
                delete cur;//删除该节点
                cur = prev->next;
            }
            else{ //不等于时cur直接向后移动
                prev = cur;
                cur = cur->next;
            }
        }
        return head;
    }
};

时间复杂度:O(N)

空间复杂度:O(1)

思路二:虚拟头结点(哨兵位)

上面的思路需要判断当头节点的值是否等于val,并且需要将头节点后移,我们可以通过设置一个虚拟头结点,让其链表本来的头结点链接在虚拟头节点的后面,这样头结点就成普通结点了,就无需再单独进行处理了。

注意返回的时候返回的是虚拟头节点的下一个结点,并非返回虚拟头节点。

image-20230516082710720

代码如下:

class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        ListNode* newhead = new ListNode(0);//申请一个虚拟头节点
        newhead->next = head;//将head链接到虚拟头节点后面
        if(newhead->next != nullptr) //当head不为空时,进入
        {
            ListNode* cur = head;
            ListNode* prev = newhead;
            while(cur)
            {
                if(cur->val == val)
                {
                    prev->next = cur->next;
                    delete cur;
                    cur = prev->next;
                }
                else
                {
                    prev = cur;
                    cur = cur->next;
                }
            }
        }
        head = newhead->next; //返回的是虚拟头节点的下一个结点
        delete newhead;
        return head;
    }
};

时间复杂度:O(N)

空间复杂度:O(1)

标签:结点,ListNode,cur,val,203,next,链表,移除,head
From: https://blog.51cto.com/u_15562309/6362869

相关文章

  • 移除Launcher界面搜索栏
    移除Launcher界面搜索栏-publicstaticfinalbooleanQSB_ON_FIRST_SCREEN=true;+publicstaticfinalbooleanQSB_ON_FIRST_SCREEN=false;//removeQSBinLauncher3byoyon2023/05/27......
  • LeetCode 114. 二叉树展开为链表
    思路1classSolution{public:voidflatten(TreeNode*root){while(root){autop=root->left;if(p)//找到左儿子的右链{while(p->right)p=p->right;//将右链插入......
  • #yyds干货盘点# LeetCode程序员面试金典:二叉树展开为链表
    题目:给你二叉树的根结点root,请你将它展开为一个单链表:展开后的单链表应该同样使用TreeNode,其中right子指针指向链表中下一个结点,而左子指针始终为null。展开后的单链表应该与二叉树先序遍历顺序相同。 示例1:输入:root=[1,2,5,3,4,null,6]输出:[1,null,2,null,3,null,4,......
  • 剑指 Offer 24. 反转链表
    剑指Offer24.反转链表</br></br>题目:定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。示例:输入:1->2->3->4->5->NULL输出:5->4->3->2->1->NULL限制:0<=节点个数<=5000</br></br>思路一:双指针法:可以通过改变链表中节点的next指针的指......
  • 【蓝桥杯入门不入土】变幻莫测的链表
    @[toc]一:链表的类型单链表什么是链表,链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null(空指针的意思)。链表的入口节点称为链表的头结点也就是head。如图所示:双链表单链表中的指针域只......
  • 图解LeetCode——24. 两两交换链表中的节点
    一、题目给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。二、示例2.1>示例1:【输入】head=[1,2,3,4]<br>【输出】[2,1,4,3]2.2>示例2:【输入】head=[]<br>【输出】[]2.3>示例......
  • day01【704. 二分查找,35.搜索插入位置 ,27. 移除元素 】
    704.二分查找二分查找理论二分查找是一个时间效率极高的算法,尤其是面对大量的数据时,其查找效率是极高,时间复杂度是log(n)。主要思想就是不断的对半折叠,每次查找都能除去一半的数据量,直到最后将所有不符合条件的结果都去除,只剩下一个符合条件的结果。二分查找需要的条件用于......
  • 代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素
    二分查找给定一个n个元素有序的(升序)整型数组nums和一个目标值target,写一个函数搜索nums中的target,如果目标值存在返回下标,否则返回-1。示例1:输入:nums=[-1,0,3,5,9,12],target=9输出:4解释:9出现在nums中并且下标为4示例2:输入:nums=[-1,0,3,......
  • pta_【CPP0038】单向链表模板类
    #include<iostream>usingnamespacestd;template<typenameT>classNode{public:Node(Tdata):data(data),next(nullptr){cout<<"NodeConstructorrun"<<endl;}Node(constNode<T>&other)......
  • 链表应用 III
    目录链表应用应用1:Leetocde.21题目分析代码实现方法一:迭代实现方法一:递归实现应用2:Leetocde.23题目分析方法一:分治方法二:优先级队列代码实现方法一:分治方法二:优先级队列应用3:Leetocde.141题目分析代码实现应用4:Leetocde.142题目分析代码实现应用5:Leetocde.876题目分析代码实现应用......