【基础篇】5 # 链表(下):写好链表代码的六个实用技巧

news2024/9/17 8:26:16

说明

【数据结构与算法之美】专栏学习笔记

技巧一:理解指针或引用的含义

指针或引用都是存储所指对象的内存地址。将某个变量赋值给指针,实际上就是将这个变量的地址赋值给指针。

例如:

  • p —> next = q:表示 p 结点中的 next 指针存储了 q 结点的内存地址。
  • p —> next = p —> next —> next:表示 p 结点的 next 指针存储了 p 结点的下下一个结点的内存地址。

技巧二:警惕指针丢失和内存泄漏

例子:在结点 a 和相邻的结点 b 之间插入结点 x,假设当前指针 p 指向结点 a。

在这里插入图片描述

错误写法如下

p —> next = x;
x —> next = p —> next;

如果按照上面的写法,先将 p 的 next 指针指向 x 结点,然后将 x 的结点的 next 指针指向 b 结点。但是这里第一步操作完指针指向结点 x,第二步就是 x 自己指向自己,导致链表断裂,结点 b 往后的所有结点都无法访问到。

正确写法如下:顺序倒一下

x —> next = p —> next;
p —> next = x;

插入结点时,要注意操作的顺序,这样才不会丢失指针,导致内存泄漏。另外删除链表结点时,也一定要记得手动释放内存空间。

技巧三:利用哨兵简化实现难度

什么是哨兵?

例子1:空链表中插入第一个结点

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

例子2:删除链表中的最后一个结点

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

针对链表的插入、删除操作,需要对插入第一个结点和删除最后一个结点的情况进行特殊处理。哨兵就是用来处理这些边界问题的,它不直接参与业务逻辑。

引入哨兵结点,不管链表是不是空,head 指针都会一直指向这个哨兵结点,并且一直存在,哨兵结点也不存储数据。

  • 带头链表:指有哨兵结点的链表
  • 不带头链表:指没有哨兵结点的链表

带头链表示意图:
在这里插入图片描述
删除最后一个节点的时候:

  • 在没有加哨兵的时候,这个时候用 p -> next = p -> next -> next 没用,就一个节点的话 p -> nextp -> next -> next 都是 null,相当于null = null。
  • 如果加上哨兵,哨兵是恒存在于链表中的,删除链表中的最后一个元素(是删除哨兵以外的最后一个,哨兵不参与业务逻辑)所以当哨兵后还跟着一个元素时,也就是有最后一个元素时,站在哨兵的位置依旧可以执行 p -> next = p -> next -> next,进而把最后一个删掉。

利用哨兵简化编程难度技巧的常见的有插入排序、归并排序、动态规划等。

技巧四:重点留意边界条件处理

检查链表代码是否正确的边界条件:

  • 如果链表为空时、链表只包含一个结点时、链表只包含两个结点时,代码是否可行?
  • 代码逻辑在处理头结点和尾结点的时候,代码是否可行?

技巧五:举例画图,辅助思考

对于稍微复杂的链表操作,可以使用举例法和画图法。

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

技巧六:多写多练,没有捷径

熟练的写出一些常见的链表操作:

  • 单链表反转
  • 链表中环的检测
  • 两个有序的链表合并
  • 删除链表倒数第 n 个结点
  • 求链表的中间结点

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

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

相关文章

opencv——Canny边缘检测

1、Canny边缘检测流程a、使用高斯滤波器,以平滑图像,滤除噪声。b、计算图像中每个像素点的梯度强度和方向。c、应用非极大值抑制,以消除边缘检测带来的杂散效应。d、应用双阈值检测来确定真实的和潜在的边缘。e、通过抑制孤立的弱边缘最终完成…

webpack4和webapck5的及新特性

30.webpack——webpack5新特性(启动、持久化缓存、资源模块、URIs、moduleIds和chunkIds、tree shaking、nodeJs的polyfill被移除、模块联邦)_俞华的博客-CSDN博客_chunkids 1、新特性1——启动命令 webpack4启动devServer,用的命令是webpac…

clickhouse库通过字段分组后获取排序后每天的前N条数据

各种查资料,都没找到,建议还是多看文档 方法1 :简单便捷: order by date,count desc limit 5 by date (取每天前5条数据,5可以随便换) sql可以随便写: 统计每天学生人数,按降序排序&#xff…

高级Spring之jdk 和 cglib 在 Spring 中的统一

Spring 中对切点、通知、切面的抽象如下 切点:接口 Pointcut,典型实现 AspectJExpressionPointcut 通知:典型接口为 MethodInterceptor 代表环绕通知 切面:Advisor,包含一个 Advice 通知,PointcutAdvisor…

关于构建校园能源管理平台的研究进展

摘要:能源与发展的矛盾已成为当今世界关注的焦点,高等学校做为一个特定的环境,近年来办学规模、校园面积、师生数量急剧增长,对能源的消耗也大幅提高。为抑制能源不合理增长,实现低碳发展,本文通过对校园能…

Go protobuf 的简单应用

环境搭建 安装 protobuf 编译器 https://github.com/protocolbuffers/protobuf/releases 解压,将bin目录加入环境变量 安装 protocol-gen-go 生成器 用于生成Go代码 https://github.com/protocolbuffers/protobuf-go/releases 解压,将可执行文件加…

第27章 分布式缓存数据库的定义实现

1 Core.HashHelper using System.Security.Cryptography; namespace Core { /// <summary> /// 【哈希助手--类】 /// <remarks> /// 摘要&#xff1a; /// 该类通过1个指定哈希加密算法生成1个唯一性的字符串(当前安全性较强的SHA-2包括有&#xff1a;SHA-2…

九龙证券|三胎概念股拉升…港股跳水,恒生科指重挫近5%

兔年首个交易日&#xff0c;A股迎来开门红&#xff0c;沪指开盘即打破3300点&#xff0c;创业板指一度涨近3%&#xff1b;港股却大幅下挫&#xff0c;恒生科技指数一度跌超5%。 详细来看&#xff0c;A股方面&#xff0c;两市股指全线高开&#xff0c;沪指开盘即打破3300点&…

WebDAV之葫芦儿·派盘+Keepass2Android

Keepass2Android 支持WebDAV方式连接葫芦儿派盘。 推荐一款密码管理器,允许人们使用复杂的组合进行登录,而不必记住所有的组合。 Keepass2Android可以支持大多数安卓互联网浏览器, Android设备上同步软件,还支持通过WebDAV添加葫芦儿派盘。

Versal系列0-AI Engine与Systolic Array

最近在开发VCK190时&#xff0c;发现Xilinx Versal系列的AI engine&#xff08;AIE&#xff09;&#xff0c;其实和Systolic Array&#xff08;SA&#xff09;有着很相似的地方。Xilinx工程师在研发AIE时&#xff0c;应该是有所借鉴SA的。Systolic Array最早是H. T. Kung于1982…

k8s工具kubepi介绍

目录 部署安装 登录 配置 日常操作 Kubepi是一个简单高效的k8s集群图形化管理工具&#xff0c;方便日常管理K8S集群&#xff0c;高效快速的查询日志定位问题的工具。 部署安装 持久化部署 # 创建持久化目录 mkdir -p /opt/kubepi # 安装 sudo docker run --privileged …

通信原理笔记—绪论

目录 通信的基本概念&#xff1a; 通信的目的&#xff1a;要克服某种障碍&#xff0c;实现信息高效、准确地传递。 狭义的通信系统&#xff1a; 广义的通信系统&#xff1a; 数字通信系统的基本组成&#xff1a; 数字通信的特点&#xff1a; (1)抗噪声和干扰能力强&#…

【自学Docker】Docker commit命令

Docker commit命令 大纲 docker commit命令教程 docker commit 命令用于根据 Docker容器 的更改创建一个新的 Dokcer镜像。该命令后面的 CONTAINER 可以是容器Id&#xff0c;或者是容器名。 docker commit命令语法 haicoder(www.haicoder.net)# docker commit [OPTIONS] CO…

day02_java入门

今日内容 零、 复习昨日 一、程序介绍 二、Java发展及特点 三、安装环境 四、运行机制 五、第一个程序 六、Java语言规范 七、了解DOS命令 八、作业 一、程序介绍 生活中程序: 为了到达某个目的,规定一些步骤. 计算机程序:为了完成某个功能,规定一些步骤. 模拟现实世界&#…

React的基本使用(及脚手架使用)

基本使用 1 React 的安装 安装命令&#xff1a;npm i react react-dom react 包是核心&#xff0c;提供创建元素、组件等功能react-dom 包提供 DOM 相关功能等 1. 引入 react 和 react-dom 两个 js 文件 <script src"./node_modules/react/umd/react.development.…

图、邻接矩阵、广度与深度优先、生成树

最近突然被问到这个问题&#xff0c;于是复习一下&#xff0c;用最通俗的语言解释。 图 无向图&#xff1a;如下左图各个顶点之间用不带箭头的边连接的图&#xff1b;相应的右图就是有向图 邻接矩阵 可以理解为表示上述图中顶点与顶点之间是否有直接相连的边&#xff08;有则…

定时任务组件Quartz

1 定时任务组件Quartz 1.1 Quartz介绍 Quartz是Job scheduling&#xff08;作业调度&#xff09;领域的一个开源项目&#xff0c;Quartz既可以单独使用也可以跟spring框架整合使用&#xff0c;在实际开发中一般会使用后者。使用Quartz可以开发一个或者多个定时任务&#xff0c;…

计算机网络第四章 网络层数据平面

4.0 目录[TOC]4.1 概述作用&#xff1a;主机到主机之间传输TCP segment或UDP datagram将段封装成IP datagram以及解封装IP datagram【在网络边缘和路由器上都要进行】A.两大功能&#xff1a;转发路由转发&#xff1a;从不同的端口接收数据&#xff0c;再通过合适的端口发送出去…

WPS表格:函数公式

文章目录1. ROW()、ROWS(array)1&#xff09;ROW()2&#xff09;ROWS(array)2. COUNT(参数)、COUNTA(参数)、COUNTIF(参数)1&#xff09;COUNT()2&#xff09;COUNTA()3&#xff09;COUNTIF()3. VLOOKUP(参数)、LOOKUP(参数)1&#xff09;VLOOKUP(参数)2&#xff09;LOOKUP(向量…

数据分析有发展前景吗?,零基础能学得会吗?

数据分析这门专业是近几年因大数据的出现而产生的新兴职业&#xff0c;分为大数据分析和数据分析师&#xff0c;区别在于大数据分析师要求更高&#xff0c;不仅需要数据分析的基本能力&#xff0c;还要具备编程能力、机器学习技能&#xff0c;以及本身所接触到处理的都是海量数…