代码随想录二刷 |链表 | 链表总结

代码随想录二刷 |链表 | 链表总结

  • 理论基础
    • 分类
      • 单链表
      • 双链表
      • 环形链表
    • 存储方式
    • 链表的定义
    • 链表操作
      • 删除链表节点
      • 添加链表节点
    • 性能分析
  • 移除链表元素
    • 在原链表上移除
    • 虚拟头节点移除
  • 设计链表
  • 反转链表
    • 双指针
    • 递归
  • 两两交换链表节点
  • 移除链表的倒数第 N 个节点
  • 链表相交
  • 环形链表II

理论基础

每一个节点都有两部分组成,一个是数据域(存放节点的数据)一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向NULL,入口处的节点又称空指针。

分类

单链表

每一个节点都有两部分组成,一个是数据域(存放节点的数据)一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向NULL,入口处的节点又称空指针。

双链表

一个节点有两个指针域,分别指向前一个节点和后一个节点,它可以双向查询。

环形链表

头节点和尾节点相连

存储方式

链表的节点在内存中是散乱分布在内存的某地址上,分配机制取决于操作系统的内存管理

链表的定义

结构体中至少需要包括数据,指向下一个节点的指针以及节点的构造函数。

如果不定义函数,不能在定义链表时初始化

struct ListNode{int val;ListNode* next;ListNode(int x) : val(x), next(nullptr) {}
};

链表操作

删除链表节点

前一节点跳过该节点指向下一节点

添加链表节点

前一节点指向该节点,该节点指向下一节点

性能分析

插入/删除(时间复杂度)查询(时间复杂度)适用场景
数组O(n)O(1)数据量固定,频繁查询,较少增删
链表O(1)O(n)数据量不固定,较少查询,频繁增删

移除链表元素

在原链表上移除

  • 移除头节点:将头节点设置为后一个节点,并且回收头节点
  • 其他节点:将前一个节点的指针指向下一个节点,并且回收该节点

虚拟头节点移除

设置虚拟头节点,从虚拟头节点开始遍历,删除每一个节点都是使用前一个节点的指针指向下一个节点,并且删除当前节点,当遍历结束,返回虚拟头节点的后一个节点

设计链表

  • 设置虚拟头节点,方便统一操作头节点
  • 获取链表的第几个元素,此时应该取到正对的那个节点,因此cur应该设置为head而不是dummyHead,并且由于index从0开始,因此index不能大于size() - 1
  • 在指定index前插入和删除,需要都遍历到目标节点的前一个节点,因此cur应当从dummyHead开始
  • 插入一个节点index可以是size,因为实际会取到左后一个节点并且在最后一个节点后边插入,删除节点index不能是size,因为没有size这个节点

反转链表

双指针

定义一个cur指针指向头节点,再定一个pre指针初始化为NULL。首先要把cur->next节点用temp指针保存一下,也就是保存一下这个节点,将cur->next指向pre,此时已经反转了一个节点,然后pre = cur,cur = pre

递归

  • 从前向后:类似于双指针只是把pre = cur,cur = pre这个部分用递归实现
  • 从后向前:先遍历到最后,然后利用cur -> next -> next = cur进行翻转

两两交换链表节点

dummyHead指向头节点,cur指针指向dummyHead,再定义两个指针用于保存节点:
tmp = cur -> next;
tmp1 = cur -> next -> next -> next

  • 第一步:cur -> next = cur -> next -> next
  • 第二步:cur -> next -> next = tmp;
  • 第三步:cur -> next -> next -> next = tmp1;

交换完两个以后将cur向后移动两位

移除链表的倒数第 N 个节点

使用双指针,一个指针先走N步,然后两个指针一起向后遍历,当前边的指针先到达尾节点,后边的指针位于第N节点,之后将该节点的 -> next -> next赋给next,完成对节点的删除

前边的指针先走N步后,还应该再走一步,保证后边的指针实际是在第N个节点的前一个,从而方便删除

链表相交

  • 本题要求的实际是两个链表首个交点的指针,交点比较的是指针相同而不是数值相等
  • 将两个链表结尾靠在一起,然后一个指针指向短链表的开始,一个指向长链表与短链表开头对齐的地方
  • 两个指针一起向后遍历,直到找到两个指针相同的节点,返回该节点即可

环形链表II

需要解决两个问题:

  • 如何判断链表有环
  • 如果有环,如何找到环状入口节点

可以使用快慢指针法,分别定义fast和slow指针,从头节点出发,fast指针每次移动两个节点,slow指针每次移动一个节点,如果fast和slow指针在途中相遇,说明这个链表有环

在这里插入图片描述

相遇时慢指针走过了x + y,快指针走过了x + y + n * (y + z),因为快指针一步走两个节点,是慢指针的两倍,假设快指针只多走了一圈,那么 n = 1,从而 x = y,也就是一个指针从头走,一个从交点走,两个指针第一次相遇的位置即为环形入口节点。

本文参考录友@海螺人的总结思维导图

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

BUUCTF 梅花香之苦寒来 1

BUUCTF:https://buuoj.cn/challenges 题目描述: 注意:得到的 flag 请包上 flag{} 提交 密文: 下载附件,解压得到一张.jpg图片。 解题思路: 1、用010 Editor看了一下,刚开始以为是修改宽高的题&#xff…

智能安全帽作业记录仪赋能智慧工地人脸识别劳务实名制

需求背景 建筑工地是一个安全事故多发的场所。目前,工程建设规模不断扩大,工艺流程纷繁复杂,如何完善现场施工现场管理,控制事故发生频率,保障文明施工一直是施工企业、政府管理部门关注的焦点。尤其随着社会的不断进…

dolphinscheduler有任务一直在运行(问题)目前对数据库解决

dolphinscheduler有任务一直在运行(问题)目前对数据库解决 危害: 这么多的任务没有结束,会涉及很多问题的,系统的数据盘会不断入职日志,数据量很大, 其实对于dolphinscheduler的性能是下降的&a…

【C++容器】优先级队列 仿函数 反向迭代器

优先级队列,仿函数,反向迭代器 优先级队列认识优先级队列模拟实现优先级队列 浅谈仿函数仿函数的大致了解仿函数的实现 反向迭代器什么是反向迭代器?反向迭代器的实现 结语 优先级队列 认识优先级队列 优先级队列(priority_queue…

实现centos7与windows共享文件夹

第一步 点击设置 第二步 第三步 第四步 让共享文件夹挂载到hgfs目录下 输入如下命令: sudo vmhgfs-fuse .host:/ /mnt/hgfs -o subtypevmhgfs-fuse,allow_other完成共享

孟德尔随机化 MR入门基础-简明教程-工具变量-暴露

孟德尔随机化(MR)入门介绍和分章分享(暂时不解读) 大家好,孟德尔随机化大火,但是什么是孟德尔随机化,具体怎么实操呢 这没有其他教程的繁冗,我这篇讲最基础的孟德尔随机化的核心步…

数据治理之考评指标类

正则表达式 [] 表述一个字符应该是什么样子 [abc] 表示一个字符可以是a\b\c[a-z] 表示所有小写[a-zA-Z]所有大小写[ a-zA-Z0-9_ ] 所有大小写字母及数字和下划线 -> \w[0-9] \d\s 空格. 表示任意字符 {} 表示有多少个这样的字符 [a-z]{1,10}最少有一个,最多有10…

vs调试输出,不显示线程已退出

如题:一堆线程退出的信息,招人烦。 其实在vs设置里可以关闭: 工具-->选项-->调试-->输出窗口:

2018年全国硕士研究生入学统一考试管理类专业学位联考数学试题——解析版

文章目录 2018 年考研管理类联考数学真题一、问题求解(本大题共 5 小题,每小题 3 分,共 45 分)下列每题给出 5 个选项中,只有一个是符合要求的,请在答题卡上将所选择的字母涂黑。真题(2018-01&a…

记录小白第一次EDUsrc:任意密码漏洞

目录 一、漏洞说明: 二、漏洞复现: 三、漏洞修复建议: 一、漏洞说明: xxxx学院身份认证系统有严重的逻辑设计缺陷:账户登录、手机登录、密码找回三个接口找到n个逻辑漏洞包括任意账号密码修改、信息泄露&#xff0…

【Python大数据笔记_day11_Hadoop进阶之MR和YARNZooKeeper】

MR 单词统计流程 已知文件内容: hadoop hive hadoop spark hive flink hive linux hive mysql ​ input结果: k1(行偏移量) v1(每行文本内容)0 hadoop hive hadoop spark hive 30 flink hive linux hive mysql map结果:k2(split切割后的单词) v2(拼接…

Java注解(Annotation)的基本知识

Java注解(Annotation)的基本知识 此文的目的只在于了解的注解的基本知识,知道注解的一些概念,使能够看懂注解的使用。 注解概述 Java 注解(Annotation)又称 Java 标注,使 JDK5.0 引入的一种注释机制。Java 语言中的…