数据结构与算法--【链表1】力扣练习 || 链表 / 移除链表元素

news2024/12/23 0:07:54

声明:本文参考代码随想录。

一、链表定义

1、概念

将线性表L=(a0,a1,……,an-1)中各元素分布在存储器的不同存储块,称为结点,通过地址或指针建立元素之间的联系。
在这里插入图片描述
每一个结点由两部分组成:数据域和指针域。结点的data域存放数据元素ai,而next域是一个指针,指向ai的直接后继ai+1所在的结点。
在这里插入图片描述

2、链表节点定义

2.1 定义构造函数的方法

// 单链表
struct ListNode {
    int val;  // 节点上存储的元素
    ListNode *next;  // 指向下一个节点的指针
    ListNode(int x) : val(x), next(NULL) {}  // 节点的构造函数
};

初始化节点就可以这样写:

ListNode* head = new ListNode(5);

2.2 不定义构造函数的方法

// 单链表
struct ListNode {
    int val;  // 节点上存储的元素
    ListNode *next;  // 指向下一个节点的指针
};

初始化节点要这样写:

ListNode* head = new ListNode();
head->val = 5;

二、链表类型

图文源自代码随想录。
1、单链表
单链表中的指针域只能指向节点的下一个节点。
在这里插入图片描述
2、双链表
每一个节点有两个指针域,一个指向下一个节点,一个指向上一个节点。
既可以向前查询也可以向后查询。
在这里插入图片描述
3、循环链表
链表首尾相连。
在这里插入图片描述

三、链表与数组对比

存储方式插入/删除(时间复杂度)查询(时间复杂度)适用场景
数组内存中连续存储O(n)O(1)数据量固定,频繁查询,较少增删
链表散乱分布,分配机制取决于操作系统的内存管理。O(1)O(n)数据量不固定,频繁增删,较少查询

数组在定义的时候,长度就是固定的,如果想改动数组的长度,就需要重新定义一个新的数组。

链表的长度可以是不固定的,并且可以动态增删, 适合数据量不固定,频繁增删,较少查询的场景。

四、移除链表元素

删除链表笔记:
在这里插入图片描述

1、方法一:

使用原链表来直接进行删除操作;此时需要判断要删除的结点是不是头结点

程序思路:

1、首先判断要删除的目标值是不是头结点的;

while(head != NULL && head->val == target){
	head = head->next; //指向头结点的指针指向下一个节点
}

2、接着,判断要删除的目标值不是头结点的情况,做相应操作。

//定义临时指针cur,用来遍历我们的链表来寻找目标值
cur = head;
while(cur != NULL && cur->next != NULL){
	if(cur->next->val == target){
		cur->next = cur->next->next;
	}
	else
		cur = cur->next;
}
//使用临时指针的遍历删除了我们想删除的值,头结点没有变,直接返回即可
return head;

使用while(),而不用if 的原因是:如果需要删除的值是1,头结点以及后面连续的值都是1,那就需要都删除了。

2、方法二:

设置虚拟头结点再进行删除操作;

程序思路

dummy_head = new(); // 创建一个虚拟头结点
dummy_head->next = head;

cur = dummy_head;
while(cur->next != NULL){
	if(cur->next->val == target){
		cur->next = cur->next->next;
	}
	else
		cur = cur->next; // 指针向后移动,继续查找
}
/*
   这里不能 return head,因为之前的head可能已经被删掉了。
   dummy_head->next其实就是新链表的head
*/
return dummy_head->next

3、总结

方法二也就是使用虚拟头结点删除元素使得操作更加统一、便捷。

五、练习

力扣题目

题目描述:
给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。
在这里插入图片描述

C代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* removeElements(struct ListNode* head, int val) {
    struct ListNode* dummy_head =  malloc(sizeof(struct ListNode));
    dummy_head->next = head;
    struct ListNode* cur;
    cur = dummy_head;
    while(cur->next != NULL){
        if(cur->next->val == val){
            cur->next = cur->next->next;
        }else
            cur = cur->next;
    }
    return dummy_head->next;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1973169.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第三届Apache Flink 极客挑战赛暨AAIG CUP比赛攻略_大浪813团队

关联比赛: 第三届 Apache Flink 极客挑战赛暨AAIG CUP——电商推荐“抱大腿”攻击识别 第三届Apache Flink 极客挑战赛暨AAIG CUP比赛攻略_大浪813团队 第三届Apache Flink 极客挑战赛暨AAIG CUP 自2021年8月17日上线以来已有 4537 个参赛队伍报名。11月09号,大赛…

Android入门之路 - WebView加载数据的几种方式

之前客户端加载H5时遇到了一些问题,我为了方便解决问题,所以将对应场景复刻到了Demo中,从之前的网络加载模拟为了本地加载Html的方式,但是没想到无意被一个基础知识点卡了一些时间,翻看往昔笔记发现未曾记录这种基础场…

C语言初阶(10)

1.野指针 野指针就是指向未知空间的指针,有以下几种情况 (1)指针未初始化 int main() {int a0;int*b;return 0; } 上面指针就是没有初始化,形成一种指向一个随机空间的地址的指针,我们可以修改成 int main() {int a0;int*bNU…

甘肃雀舌面:舌尖上的独特韵味

雀舌面,顾名思义,其面条形状如同雀舌般小巧精致。这一独特的形态并非偶然所得,而是源于精湛的手工技艺。制作雀舌面,对面粉的选择和面团的揉制有着极高的要求。经验丰富的师傅会精心挑选优质面粉,加入适量的水&#xf…

嵌入式学习---DAY17:共用体与位运算

链表剩余的一些内容 一、共用体 union 共用体名 名称首字母大写 { 成员表列; }; union Demo {int i;short s;char c; }; int main(void) {union Demo d;d.i 10;d.s 100;d.c 200;printf("%d\n", sizeof(d)); /…

一起学习LeetCode热题100道(24/100)

24.回文链表(学习) 给你一个单链表的头节点 head ,请你判断该链表是否为 回文链表 。如果是,返回 true ;否则,返回 false 。 示例 1: 输入:head [1,2,2,1] 输出:true 示例 2: …

鸿蒙Scroll布局,横向与纵向

注意,当横向scroll时,直接子元素的宽,不能100%, 当纵向scroll时,直接子元素的高,不能100%​​​​​​​ 1、纵向代码: 方法1:用数值计算,来设置中间的高度: …

Django函数视图和类视图

函数视图 1.全局环境的urls.py引入映入应用的urls,避免后期开发路由过多而导致杂乱 from django.contrib import admin from django.urls import path, includeurlpatterns [path(account/, include(account.urls)),#使用include函数引入,表示account…

搜狗爬虫(www.sogou.com)IP及UA,真实采集数据

一、数据来源: 1、这批搜狗爬虫(www.sogou.com)IP来源于尚贤达猎头网站采集数据; ​ 2、数据采集时间段:2023年10月-2024年7月; 3、判断标准:主要根据用户代理是否包含“www.sogou.com”和IP核实…

我菜单为什么跟着滑动了?!!—— 固定定位为什么会失效?

背景:最近在写一个H5页面项目,头部有个菜单栏,需要固定在顶部不动,但是滑动之后设置并没有生效,之前开发中也遇到过类似的固定失效的情况,就去详细了解了下有哪些可能导致固定定位失效的情况。希望有些场景…

数据库文件管理

数据库文件与普通文件区别: 1.普通文件对数据管理(增删改查)效率低 2.数据库对数据管理效率高,使用方便 常用数据库: 1.关系型数据库: 将复杂的数据结构简化为二维表格形式 大型:Oracle、DB2 中型:MySql、SQLServer 小型:Sqlite 2.非关…

【传知代码】主动学习实现领域自适应语义分割(论文复现)

在当今计算机视觉和人工智能领域,语义分割技术的发展正日益成为实现智能系统感知和理解复杂场景的关键。然而,传统的语义分割模型往往面临着在新领域或不同环境下适应性不足的挑战。为了解决这一问题,主动学习作为一种强大的技术手段&#xf…

每日学术速递8.2

1.A Scalable Quantum Non-local Neural Network for Image Classification 标题: 用于图像分类的可扩展量子非局部神经网络 作者: Sparsh Gupta, Debanjan Konar, Vaneet Aggarwal 文章链接:https://arxiv.org/abs/2407.18906 摘要&#x…

echarts图表--雷达图(参数详解)

这是官网给出的几种雷达图: Examples - Apache ECharts 雷达图(Radar Chart)是一种用于展示多维数据的图表,尤其适合于比较不同样本或观测在多个相同变量上的表现。在使用ECharts或PyEcharts等可视化库绘制雷达图时,…

Prometheus 监控 Nginx

作者:琉璃 一、Nginx_exporter安装 下载链接: https://github.com/discordianfish/nginx_exporter 下载nginx_exporter的docker镜像。 ocker pull fish/nginx-exporter先run一下,执行之后,会hold住,先不要关闭窗口…

IP 地址处理模块IPy

IP 地址处理模块IPy 介绍安装基本操作多网络计算方法 介绍 IP 地址规划是网络设计中非常重要的一个环节,规划的好坏会直接影响路由协议算法的效率,包括网络性能、可扩展性等方面,在这个过程当中,免不了要计算大量的 IP 地址&…

【python】Linux升级版本

目的 迁移项目包路径到服务器上 查看服务器包是否和本地已有项目python版本相同然后发现~嗯不一样 项目上包时用的3.8~ 服务器用的2.7 查看方法: python -version解决方案 一:项目所有包重新下载 二:升级服务器python版本 第二种步骤&…

【虚拟仿真】Unity3D中实现2DUI显示在3D物体旁边

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址QQ群:398291828大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 一、前言 这篇文章来实现2DUI显示在3D物体旁边,当我们需要在3D模型旁边显示2DUI的时候,比如人物的对…

医疗AI新突破!多模态对齐网络精准预测X光生存,自动生成医疗报告!

PS:写在前面,近期感谢很多小伙伴关注到我写的论文解读,我也会持续更新吖~同时希望大家多多支持本人的公主号~ 想了解更多医学图像论文资料请移步公主👸号哦~~~后期将持续更新!! 关注我,让我们一…

智能驾驶学习笔记,第一天

智能驾驶是智能汽车的核心,指基于先进的传感器和计算平台,通过人工智能技术,让汽车具备自主行驶的能力,旨在辅助驾驶员安全、便捷、高效地完成驾驶任务。智能驾驶有助于减少交通事故、改善交通拥堵,并提高行驶安全性和驾乘舒适性。…