如何轻松写出正确的链表代码

2023-05-16

如何轻松写出正确的链表代码?

1、理解指针或引用的含义

将某个变量赋值给指针,实际上就是将这个变量的地址赋值给指针,或者反过来说,指针中存储了这个变量的内存地址,指向了这个变量,通过指针就能找到这个变量。

p->next=q: p 结点中的 next 指针存储了 q 结点的内存地址。

p->next=p->next->next: p 结点的 next 指针存储了 p 结点的下下一个结点的内存地址。

2、警惕指针丢失和内存泄漏

在这里插入图片描述

p->next = x; \quad \quad // 将p的next指针指向x结点, p 结点中的 next 指针存储了 x 结点的内存地址;

x->next = p->next; // x的结点的next指针存储p结点的下一个节点的内存地址,即x的内存地址,自己指向自己。因此,整个链表也就断成了两半,从结点 b 往后的所有结点都无法访问到了;

正确的应该为:要先将结点 x 的 next 指针指向结点 b,再把结点 a 的 next 指针指向结点 x,这样才不会丢失指针,导致内存泄漏

x->next = p->next;
p->next = x;

3、利用哨兵简化实现难度

针对链表的插入、删除操作,需要对插入第一个结点和删除最后一个结点的情况进行特殊处理

① 在结点 p 后面插入一个新的结点:

new_node->next = p->next;
p->next = new_node;

② 向一个空链表中插入第一个结点

if (head == null) {
  head = new_node;
}

③ 单链表结点删除操作:删除结点 p 的后继结点

p->next = p->next->next;

④ 要删除链表中的最后一个结点

if (head->next == null) {
   head = null;
}

head=null 表示链表中没有结点了。其中 head 表示头结点指针,指向链表中的第一个结点。

如果我们引入哨兵结点,在任何时候,不管链表是不是空,head 指针都会一直指向这个哨兵结点。我们也把这种有哨兵结点的链表叫带头链表。相反,没有哨兵结点的链表就叫作不带头链表

带头链表: 你可以发现,哨兵结点是不存储数据的。因为哨兵结点一直存在,所以插入第一个结点和插入其他结点,删除最后一个结点和删除其他结点,都可以统一为相同的代码实现逻辑了。
在这里插入图片描述

4、重点留意边界条件处理

检查链表代码是否正确的边界条件有这样几个:

① 如果链表为空时,代码是否能正常工作?

② 如果链表只包含一个结点时,代码是否能正常工作?

③ 如果链表只包含两个结点时,代码是否能正常工作?

④ 代码逻辑在处理头结点和尾结点的时候,是否能正常工作?

5、举例画图,辅助思考

单链表中插入一个数据:
在这里插入图片描述

6、多写多练,没有捷径

5个常见的链表操作:

① 单链表反转

② 链表中环的检测

③ 两个有序链表合并

④ 删除链表倒数第n个节点

⑤ 求链表的中间节点

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何轻松写出正确的链表代码 的相关文章

  • 关于move_base无法加载的问题[move_base-11] process has died

    项目场景 xff1a kinetic下使用move base进行导航 问题描述 xff1a 之前move base使用的好好的 xff0c 结果突然之间不能用了 xff0c 出现move base功能包无法加载的情况 报错如下 xff1a
  • Jetson Nano利用普通引脚进行PWM波输出

    这篇博客我就简单介绍一下好了 xff0c 不深入讲了 需要注意的是 xff0c 我这里用到了ROS xff0c 所以运行之前需要安装ROS 初始化中有一个12和50 xff0c 分别代表频率 xff0c 完之后他就会让pin12自动输出50
  • Git基础 - git tag 一文真正的搞懂git标签的使用

    1 什么是tag 1 1 tag的简单理解 tag 中文我们可以称它为 标签 简单的理解 xff0c tag 就是 对某次 commit 的一个标识 xff0c 相当于起了一个别名 例如 xff0c 在项目发布某个版本的时候 xff0c 针
  • C++学习笔记十六:使用OpenCv(c++)调用yolo模型实现目标检测

    一 前言 因为之前都是直接使用python编程来实现目标检测 xff0c 而且是直接使用模型 于是就想了解一下使用c 43 43 语言如何进行目标检测 xff0c 也能帮助自己更好的熟悉c 43 43 的语法 简单起见 xff0c 使用op
  • requests python

    requests是模拟客户端向服务端发送http请求的模块 可以方便的对网页进行爬取 xff0c 是学习python爬虫的较好的http请求模块 1 安装 pip install requests 2 使用方法 方法解释requests r
  • QGraphicsView加入到布局,所在的窗口变大,视图和场景都变大,使场景中的矩形也变大

    需求 窗口变化时 xff0c 窗口中的矩形框也变化 效果展示 当窗口变大时其矩形框也变大 要求绿色矩形框与蓝色背景的边距始终为10 代码 直接上项目的代码 项目结构 各文件的代码 main cpp span class token macr
  • TX2通过串口或CAN和其他设备通信(一)--- 串口通信

    TX2通过串口或CAN和其他设备通信 xff08 一 xff09 串口通信 背景介绍 Jetson TX2是NVIDIA推出的一款嵌入式开发平台 xff0c TX2所提供的性能为早前版本的两倍 xff0c 即能够以两倍以上的功效运行 xff
  • Micropython——九轴传感器(MPU6050)的使用及算法(二)

    前言 xff1a 在上篇文章中 xff0c 简单地实现了九轴传感器 xff08 MPU6050 xff09 的获取加速度 角速度以及温度的数值 但是 xff0c 我们知道 xff0c 对于MPU6050来说 xff0c 其提供的数据会夹杂有
  • Micropython——九轴传感器(MPU6050)的使用及算法(三)

    简介 xff1a 上篇文章中 xff0c 关于九轴传感器 xff08 MPU6050 xff09 xff0c 学习其如何对其生成的数据偏移进行校准 xff0c 这节课我们来将其中的一个问题来进行解决 关于MPU6050地址问题 xff0c
  • C语言库函数——string.h

    目录 摘要 xff1a 一 头文件 string h 中定义的函数 strcpy 用法 xff1a 代码示例 xff1a 参数 xff1a memchr 用法 xff1a 代码示例 xff1a 参数 xff1a strlen 用法 xff1
  • 2019年电赛准备程序STM32版本

    现在是2019年8月11号 xff0c 昨天电赛结束 xff0c 不愿意好的东西随时间而消失不见 xff0c 所以将准备的程序总结一下 xff0c 分享出来 目录 一 电赛的故事 二 准备程序 1 PID 2 滤波 3 菜单 4 直流编码电
  • IDEA格式化js代码

    1 在IDEA Settings Keymap 里面 xff0c 搜索关键字 format code 2 找到格式化代码的快捷键 xff1a Ctrl 43 Alt 43 L 注意这里是大写的L 3 打开需要格式化的js代码 xff0c 输
  • 多旋翼飞行器设计之减震系统的重要性

    减震系统是多旋翼飞行器设计中非常重要的环节 xff0c 好的减震系统可以很好地减轻数字滤波的负担 xff0c 同时能极大地提升控制系统的性能 xff1b 下面针对整个减震系统做一个简要分析 xff1b 首先 xff0c IMU 43 减震海
  • Arduino接收航模遥控器RC接收机的PWM数据

    本文将介绍如何使用Arduino读取RC接收机的PWM数据 1 硬件部分 我的设备 xff1a 接收机 遥控器发射机 将Arduino Nano的引脚 D8 D11 接到接收机的1 4通道 xff0c 接收机上的电源正极和负极连接到Ardu
  • 数据库安全关键技术之数据库脱敏技术详解

    数据库脱敏是一种采用专门的脱敏算法对敏感数据进行变形 屏蔽 替换 随机化 加密 xff0c 并将敏感数据转化为虚构数据的技术 按照作用位置 实现原理不同 xff0c 数据脱敏可以划分为静态数据脱敏 xff08 Static Data Mas
  • qt使用样式表设置窗口widget无边框的情况下为圆角

    提要 窗口widget是无法直接通过样式表设置为圆角的 xff0c 需要在窗口QWidget中拖入控件QFrame xff0c 将QFrame设置的和窗口QWidget一样大小 xff0c 将窗口QWidget中需要的控件拖入到QFrame
  • 【VSCode】启动VSCode时终端自动执行cmd命令,解放双手!

    34 terminal integrated defaultProfile windows 34 34 Command Prompt 34 34 terminal integrated profiles windows 34 34 Powe
  • GPIO寄存器的地址怎么寻找?

    由上图知 xff0c GPIOC的地址就是在这个PERIPH BASE地址的基础上偏移得到得 我们可以一步一步的计算一下GPIOC的地址是多少 0x40000000 43 0x10000 43 0x1000 61 61 0x4001 100
  • Arduino 定时器中断 外部中断

    中断 Interrupt 中断 Interrupt 是计算机的一个重要概念 现代计算机普遍采用中断技术 什么是中断呢 CPU执行时原本是按照程序指令一条一条向下执行的 但如果此时发生了某一件事件B请求CPU迅速去处理 中断发生 CPU暂时中
  • 【git】使用笔记

    拉取远程分支 git checkout b new branch name origin git reo origin branch name 如果git 项目拉取不到 xff0c 可能是没有更新远程信息 git fetch

随机推荐