【数据结构】--单链表力扣面试题①移除链表元素

news/2024/10/18 7:52:47/

  

题述:

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

 

思考:

为什么说要返回新的头结点,因为你删除的可能存在把原来的头结点删除的情况,这时就需要有新的头结点。这道题其实就是考察增删查改的变形

思路:

1、想删除值是val的那一个,那就要先找到它,这个节点值域是val的那一个节点可能有好几个。

2、因为涉及删除某一个节点,那就一定要使被删除节点的前一个节点的指针域指向被删除节点原指向的下一节点。所以重点是找到被删除节点的前驱节点法一就是找要被删除的前一个节点,判断他的next指向的下一节点的值域是不是val值。法二就是定义两个指针,一个指向前,一个指向后。我们推荐法二。因为如果省几个变量来节省内存是没必要的,并不是没有考虑空间复杂度的问题,而是因为多定义几个变量,空间复杂度还是o(1)。相对来说法二在实现中会更清晰一点。

 

注意点:头删和中间删除节点的情况要分别考虑

如果是头删就不需要prev指针,因为prev初始化是NULL,而你写成prev->next就对空指针访问了,这是非法访问内存的行为,是不被允许的!因此只需要考虑cur怎么动。

如果是中间删除需要prev指针了,因为其指针域也需要跟着改变。

 最后代码如下:

#include<stdio.h>
#include<stdlib.h>struct ListNode
{int val;struct ListNode* next;
};
struct ListNode* removeElements(struct ListNode* head,int val)
{struct ListNode* prev = NULL, * cur = head;//遍历肯定要用cur去遍历while (cur){if (cur->val == val){	//1、头删,如果第一个节点数据就=val了if (cur == head){head = cur->next;free(cur);cur = head;//这里头删是不用管prev的,因为后续不相等prev会=cur}//2、中间删除的情况处理else{prev->next = cur->next;free(cur);cur = prev->next;}}else{	//不相等则循环遍历往下走prev = cur;//不要写prev=prev->next,因为prev可能有是NULL的情况cur = cur->next;}}return head;
}
int main()
{struct ListNode* n1 = (struct ListNode*)malloc(sizeof(struct ListNode));struct ListNode* n2 = (struct ListNode*)malloc(sizeof(struct ListNode));struct ListNode* n3 = (struct ListNode*)malloc(sizeof(struct ListNode));struct ListNode* n4 = (struct ListNode*)malloc(sizeof(struct ListNode));n1->val = 7;n2->val = 7;n3->val = 7;n4->val = 7;n1->next = n2;n2->next = n3;n3->next = n4;n4->next = NULL;struct ListNode* head = removeElements(n1, 7);return 0;
}


http://www.ppmy.cn/news/86574.html

相关文章

Spring-IOC是什么

Spring-IOC是什么 Spring-IOC是什么IOC是什么 Spring-IOC是什么 Spring-IOC是Spring框架的核心&#xff0c;是一个容器&#xff0c;它负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。 IOC是什么 控制反转&#xff0c;指的是将对象的控制权交给Spring容器&a…

自动构建之Makefile

链接: 自动构建之CMake Makefile Makefile是用于自动化构建软件项目的工具&#xff0c;Makefile的优点是简单、直接&#xff0c;可以直接使用make工具进行构建。但是&#xff0c;Makefile通常需要手动编写和维护&#xff0c;可能会导致跨平台和跨编译器的兼容性问题。 Makef…

adb 命令速查(下)

ADB 关于APP安装、调试和monkey压力测试 作者&#xff1a;炭烤毛蛋 &#xff0c;查看博主了解更多。 提示&#xff1a;承接上篇《adb 命令速查(中)》&#xff0c;本文将 文章目录 ADB 关于APP安装、调试和monkey压力测试7 adb 关于 apk 的相关操作7.1 安装 apk普通安装带有命…

虹科HiveMQ与MQTT:构建互联汽车的新架构

前言 随着汽车的互联程度越来越高&#xff0c;汽车制造商和互联汽车平台提供商通过使用物联网技术&#xff0c;提供新服务并从车辆收集有价值的遥测数据&#xff0c;以此来增加营收。从高效的车队管理和汽车共享到预测性维护和高级驾驶员辅助系统&#xff0c;未来移动出行的可…

uniapp内使用 mescroll

前言 在使用uniapp开发项目的过程中&#xff0c;在很多场景里都需要下拉刷新和上拉加载&#xff0c;而 mescroll.js 则是一个非常精致的下拉刷新和上拉加载 js 框架。 官网地址&#xff1a;mescroll 介绍 mescroll.js 是在 H5端 运行的下拉刷新和上拉加载插件&#xff0c;时…

windows解决python安装django架构没有django-admin命令

目录 一.尝试安装与配置 1.直接pip命令安装 2.用pycharm测试 3.官网下包安装 二.解决 1.找到django安装的路径 2.配置系统变量 3.测试创建项目 3.1.执行访问页面 3.2.解决 3.3.继续测试 4.pycharm打开 一.尝试安装与配置 1.直接pip命令安装 pip install django dja…

Java 基础语法学习笔记

目录 一、Java语言概述 1.1 Java 的出现 1.2 Java的主要特性 1.3 Java语言的特点 1.4 Java语言的核心机制 1.5 Java语言的环境搭建 二、第一个Java程序 2.1 需要注意的问题 2.2 注释&#xff08;comment) 2.3 注意点&#xff1a; 2.4 Java API 的文档 2.5 第一个 Jav…

【Leetcode60天带刷】day02—— 977.有序数组的平方、209.长度最小的子数组、 59.螺旋矩阵II

题目&#xff1a;997.有序数组的平方 Leetcode原题链接&#xff1a;997.有序数组的平方——力扣 思考历程与知识点&#xff1a; 题目的意思很简单&#xff0c;就是把每个数的平方&#xff0c;按从小到大的顺序排个序&#xff0c;再输出出来。 第一想法是先每个数平方一遍&a…