链表详解-leetcode203.移除链表元素

2024-03-16 17:04

本文主要是介绍链表详解-leetcode203.移除链表元素,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

链表

移除链表元素

题目:

题意:删除链表中等于给定值 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 输出:[]

在这里插入图片描述

这里的head指的是链表起始的第一个结构体

说明:链表是一个结构体。对于单向链表来说,结构体里存储了val值和连接的下一个结构体的地址next。对于一个cur链表来说,cur就是这个结构体(一个val,一个next)开辟的首地址,也就是存储val的地址即(&(cur->val))的值,而存储val和next的地址是相连的 ,在结构体开辟的地址之后,即(&(cur->val)和&(cur->)) ; 并且cur->next存放的地址是连接的开辟下一个链表结构体的首地址。

在这里插入图片描述

题解:

虚拟头节点:如果第一个元素需要删除,就用到了虚拟头节点

/*** Definition for singly-linked list.* 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 != NULL) {if (cur->next->val == val) {// cout<<&(cur->next)<<endl;// cout<<&(cur->val)<<endl;ListNode* temp = cur->next;cur->next = cur->next->next;delete temp;} else {cur = cur->next;cout << "val" << &(cur->val) << endl;cout << cur << endl;cout << "next" << &(cur->next) << endl;cout << cur->next << endl;}}head = dummyHead->next;delete dummyHead;return head;}
};

标准输出:

val0x502000000050
0x502000000050
next0x502000000058
0x502000000070
val0x502000000070
0x502000000070
next0x502000000078
0x502000000090
val0x5020000000b0
0x5020000000b0
next0x5020000000b8
0x5020000000d0
val0x5020000000d0
0x5020000000d0
next0x5020000000d8
0x5020000000f0
val0x5020000000f0
0x5020000000f0
next0x5020000000f8
0x502000000110

直接使用原来的链表进行移除节点操作:将第一个节点和后面的节点分开计算。

/*** Definition for singly-linked list.* 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) {while(head!=NULL&&head->val==val){ListNode* temp=head;head=head->next;delete temp;}ListNode* cur;cur=head;while(cur!=NULL&&cur->next!=NULL)  // cur如果是一个空指针  或者说cur没有开辟地址内存 那么cur就没有next的内容 就会报错{if(cur->next->val==val){ListNode* temp=cur->next;cur->next=cur->next->next;delete temp;}else{cur=cur->next;}}return head;}
};

**注意:**当头链表不是要删除的链表的时候,要判断指针(即开辟链表的首地址)是否为空指针,要是空指针那么空指针中的存放地址的next的查询就会报错。

这篇关于链表详解-leetcode203.移除链表元素的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/816125

相关文章

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

csu1329(双向链表)

题意:给n个盒子,编号为1到n,四个操作:1、将x盒子移到y的左边;2、将x盒子移到y的右边;3、交换x和y盒子的位置;4、将所有的盒子反过来放。 思路分析:用双向链表解决。每个操作的时间复杂度为O(1),用数组来模拟链表,下面的代码是参考刘老师的标程写的。 代码如下: #include<iostream>#include<algorithm>#include<stdio.h>#

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

K8S(Kubernetes)开源的容器编排平台安装步骤详解

K8S(Kubernetes)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。以下是K8S容器编排平台的安装步骤、使用方式及特点的概述: 安装步骤: 安装Docker:K8S需要基于Docker来运行容器化应用程序。首先要在所有节点上安装Docker引擎。 安装Kubernetes Master:在集群中选择一台主机作为Master节点,安装K8S的控制平面组件,如AP

深入手撕链表

链表 分类概念单链表增尾插头插插入 删尾删头删删除 查完整实现带头不带头 双向链表初始化增尾插头插插入 删查完整代码 数组 分类 #mermaid-svg-qKD178fTiiaYeKjl {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-

建立升序链表

题目1181:遍历链表 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2744 解决:1186 题目描述: 建立一个升序链表并遍历输出。 输入: 输入的每个案例中第一行包括1个整数:n(1<=n<=1000),接下来的一行包括n个整数。 输出: 可能有多组测试数据,对于每组数据, 将n个整数建立升序链表,之后遍历链表并输出。 样例输

嵌入式Openharmony系统构建与启动详解

大家好,今天主要给大家分享一下,如何构建Openharmony子系统以及系统的启动过程分解。 第一:OpenHarmony系统构建      首先熟悉一下,构建系统是一种自动化处理工具的集合,通过将源代码文件进行一系列处理,最终生成和用户可以使用的目标文件。这里的目标文件包括静态链接库文件、动态链接库文件、可执行文件、脚本文件、配置文件等。      我们在编写hellowor

LabVIEW FIFO详解

在LabVIEW的FPGA开发中,FIFO(先入先出队列)是常用的数据传输机制。通过配置FIFO的属性,工程师可以在FPGA和主机之间,或不同FPGA VIs之间进行高效的数据传输。根据具体需求,FIFO有多种类型与实现方式,包括目标范围内FIFO(Target-Scoped)、DMA FIFO以及点对点流(Peer-to-Peer)。 FIFO类型 **目标范围FIFO(Target-Sc

019、JOptionPane类的常用静态方法详解

目录 JOptionPane类的常用静态方法详解 1. showInputDialog()方法 1.1基本用法 1.2带有默认值的输入框 1.3带有选项的输入对话框 1.4自定义图标的输入对话框 2. showConfirmDialog()方法 2.1基本用法 2.2自定义按钮和图标 2.3带有自定义组件的确认对话框 3. showMessageDialog()方法 3.1