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

news2024/11/25 4:18:02

文章来源于极客时间前google工程师−王争专栏。

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

指针:存储所指对象的内存地址

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

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

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

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

image

p->next = x 
x->next = p->next
  • p->next指针完成第一步,不再指向结点b了,而是指向了结点x。
  • 第二行相当于将x赋值给x->next,自己指向自己,链表断开。
  • 左边next代表指针,右边next代表结点。

正确操作是将上面两行代码执行顺序调换。

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

单链表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指针都会一直指向这个哨兵结点

  • 带有哨兵结点的链表叫作带头链表
  • 没有哨兵结点的链表叫作不带头链表

实现:返回数组中特定值的下标

  • 普通方法
//n为数组a的长度
public int find(char[] a,int n,char key){
    if(a == null || n<=0){
        return -1;
    }
    int i = 0;
    while(i<n){
        if(a[i] == key){
            return i;
        }
        ++i;
    }
    return -1;
}
  • 哨兵机制
public int find(char[] a,int n,char key){
    if(a == null || n<=0){
        return -1;
    }
    if(a[n-1] == key){
        return n-1;
    }
    //记录数组临界位置
    char temp = a[n-1];
    //哨兵处理
    a[n-1] = key;
    int i=0;
    //由于哨兵 优化掉一条i<n的比较语句
    while(a[i] != key){
        ++i;
    }
    //恢复临界值
    a[n-1] = temp;
    //数组0~n-2位置中都没有key
    if(i == n-1){
        return -1;
    }
    return i;
}

重点留意边界条件处理

基础考虑

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

举例画图,辅助思考

多写多练

  • 单链表反转
  • 链表中环的检测
  • 两个有序链表合并
  • 删除链表倒数第n个结点
  • 求链表的中间结点
  • 206,141,21,19,876(leecode对应编号)

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

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

相关文章

【WIN】双机调试——Net模式

概述&#xff1a;windows 双机调试可以在主页搜索 bcdedit 命令。 参考&#xff1a; Set up KDNET network kernel debugging manually - Windows drivers | Microsoft Learn 双机调试是一个非常有用的技术&#xff0c;方便内核、驱动等调试场景。 本文主要记录个人尝试使用ne…

2023年中国建筑安装行业市场现状分析:占比建筑业总产值8.4%[图]

建筑业是我国经济支柱产业之一。建筑业包括房屋建筑业、土木工程建筑业、建筑安装业、建筑装修装饰和其他建筑业。建筑安装行业是建筑业的一个细分行业&#xff0c;其主要包括线路安装、管道安装、设备安装三个细分行业&#xff0c;具体是指建筑物主题工程竣工后&#xff0c;建…

pg_rman 的编译和使用

一、编译 下载地址&#xff1a; ossc-db/pg_rman: Backup and restore management tool for PostgreSQL (github.com)https://github.com/ossc-db/pg_rman代码由日本电信的运维团队维护。 针对不同的PostgreSQL版本&#xff0c;使用不同的分支编译&#xff0c;我的PG版本试1…

【 构建maven工程时,配置了阿里云的前提下,依旧使用中央仓库下载依赖导致失败的问题!】

构建maven工程时&#xff0c;配置了阿里云的前提下&#xff0c;依旧使用中央仓库下载依赖导致失败的问题&#xff01;&#xff01;&#xff01; 错误提示信息: Cannot download ZIP distribution from https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3…

Knife4j_接口概述、常用注解详解、搭建swagger项目、功能概述

文章目录 ①. knife4j的概述②. knife4j核心功能③. 从0开始搭建knife4j项目④. 常用注解 - Api④. ApiOperation注解⑤. ApiModelProperty注解⑥. ApiImplicitParam注解⑦. ApiImplicitParams注解⑧. 限制请求方式⑨. 导出离线API文档 ①. knife4j的概述 ①. knife4j是为Java …

C#上位机——根据命令发送

C#上位机——根据命令发送 第一步&#xff1a;设置窗口的布局 第二步&#xff1a;设置各个属性 第三步&#xff1a;编写各个模块之间的关系

【力扣】单调栈:901. 股票价格跨度

【力扣】单调栈&#xff1a;901. 股票价格跨度 文章目录 【力扣】单调栈&#xff1a;901. 股票价格跨度1. 题目介绍2. 思路3. 解题代码参考 1. 题目介绍 设计一个算法收集某些股票的每日报价&#xff0c;并返回该股票当日价格的 跨度 。 当日股票价格的 跨度 被定义为股票价格…

文献综述|CV领域神经网络水印发展综述

前言&#xff1a;最近接触了「模型水印」这一研究领域&#xff0c;阅读几篇综述之后&#xff0c;大致了解了本领域的研究现状&#xff0c;本文就来总结一下该领域的一些基础知识&#xff0c;以飨读者。 ⚠️注&#xff1a;本文中出现的研究工作均基于计算机视觉任务开展&#x…

Git 学习笔记 | 安装 Git 及环境配置

Git 学习笔记 | 安装 Git 及环境配置 Git 学习笔记 | 安装 Git 及环境配置安装 Git配置 Git查看配置 Git 学习笔记 | 安装 Git 及环境配置 安装 Git 官方网站&#xff1a;https://git-scm.com/ 官网下载太慢&#xff0c;我们可以使用淘宝镜像下载&#xff1a;https://regist…

自学接口测试系列 —— 自动化测试用例设计基础!

一、接口测试思路总结 ❓首先我们在进行接口测试设计前思考一个问题&#xff1a;接口测试&#xff0c;测试的是什么&#xff1f; ❗我们必须要知道&#xff0c;接口测试的本质&#xff1a;是根据接口的参数&#xff0c;设计输入数据&#xff0c;验证接口的返回值。 那么接口…

Fast DDS之Transport

目录 transport层负责为DDS用户数据收发和服务发现提供通信。包含UDP&#xff0c;TCP&#xff0c;SHM。

Python——— 模块

&#xff08;一&#xff09;模块化(module)程序设计理念 模块和包概念的进化史 模块和包概念的进化史 ① Python程序由模块组成。一个模块对应 python 源文件&#xff0c;一般后缀名是&#xff1a; .py ② 模块由语句组成。运行Python 程序时&#xff0c;按照模块中语句的顺…

手把手教你编写LoadRunner脚本

编写 LoadRunner 脚本需要熟悉脚本语言、业务场景、参数化技术、断言和事务等基础知识。 在实际编写时&#xff0c;可以根据具体测试需求&#xff0c;结合实际情况进行合理的配置和调整。 基本步骤 创建脚本 在 LoadRunner 的 Controller 模块中&#xff0c;创建一个新的测试…

详解TCP三次握手(建立连接)和四次握手(释放连接)

TCP是是一个面向连接的协议&#xff0c;无论哪一方发送数据之前&#xff0c;都必须在双方之间建立一条连接。 一、建立连接 建立TCP连接时&#xff0c;要经历这样的流程&#xff1a; ① 请求端(通常称为客户)发送一个SYN段指明客户打算连接的服务器的端口&#xff0c;以及初始…

基于微信小程序的个人健康数据管理平台设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

Unity可视化Shader工具ASE介绍——2、ASE的Shader创建和输入输出

大家好&#xff0c;我是阿赵&#xff0c;这里继续介绍Unity可视化写Shader的ASE插件的用法。上一篇介绍了ASE的安装和编辑器界面分布&#xff0c;这一篇主要是通过一个简单的例子介绍shader的创建和输入输出。 一、ASE的Shader创建 这里先选择Surface类型的Shader&#xff0c;…

Git 学习笔记 | 版本控制和版本控制工具

Git 学习笔记 | 版本控制和版本控制工具 Git 学习笔记 | 版本控制和版本控制工具什么是版本控制&#xff1f;版本管理工具的特性版本管理工具的发展简史主流的版本控制器本地版本控制集中版本控制分布式版本控制 Git与SVN的主要区别 Git 学习笔记 | 版本控制和版本控制工具 学…

孕期能吃韭黄吗?坐月子和哺乳期能吃韭黄吗?宝宝能不能吃韭黄?

韭黄又称韭芽、黄韭、韭菜白。韭菜隔绝光线&#xff0c;完全在黑暗中生长&#xff0c;因无阳光供给&#xff0c;不能进行光合作用&#xff0c;合成叶绿素&#xff0c;就会变成黄色&#xff0c;称之为「韭黄」。 孕期能吃吗&#xff1f; 能吃 韭黄味道独特&#xff0c;富含膳…

[Python入门教程]01 Python开发环境搭建

Python开发环境搭建 本文介绍python开发环境的安装&#xff0c;使用anaconda做环境管理&#xff0c;VS code写代码。搭建开发环境是学习的第一步&#xff0c;本文将详细介绍anaconda和vs code的安装过程&#xff0c;并测试安装结果。 视频教程链接&#xff1a;https://www.bil…

【ElasticSearch】深入了解 ElasticSearch:开源搜索引擎的力量

文章目录 前言一、初识 ElasticSearch 搜索引擎1.1 ElasticSearch 的核心概念1.2 ElasticSearch 的演进历程1.3 ElasticSearch 的优势与未来 二、正排索引与倒排索引&#xff1a;数据库与 ElasticSearch 的差异2.1 对正排索引的认识2.2 对倒排索引的认识2.3 正排索引 vs. 倒排索…