数据结构与算法--02链表-如何轻松写出链表代码

2023-05-16

数据结构与算法--02链表-如何轻松写出链表代码

写好链表并不是件容易的事情,尤其是一些复杂的链表操作,如链表反转、有序链表合并等等。即使能够写出代码,但及其容易出错。所以付出一定量的精力是前提条件,另外还需要掌握一些必要的技巧。

1.理解指针或引用的含义
  有些语言如C语言,具有指针的概念,而其他语言如Java、Python则使用“引用”来代替指针。但本质上都一样,都是存储所指对象的内存地址。
  所谓指针的使用,其实就是将某个变量的地址赋值给指针,或者可以理解为指针中存储了该变量的内存地址,通过指针就能找到该变量。

  链表中指针的使用:

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

2.注意指针丢失和内存泄漏
  例如插入链表结点的操作:

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

  上述代码完成第1行代码后,已经指向了结点想。第2行相当于将x赋值给了x->next,自己指向了自己,因此整个链表断开为两半,发生指针丢失和内存泄漏。把上述1、2行代码代码互换即可:

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

删除链表结点与插入同理。
  对于C语言,内存管理是有程序员负责的,需要手动释放内存空间。而像Java这种虚拟机自动管理内存的编程语言来说,就不需要考虑这么多了。

3.利用哨兵简化实现难度
  针对链表的插入、删除操作,需要对插入第一个结点和删除最后一个结点的情况进行特殊处理。但这样代码实现起来就会很繁琐,不简洁。那么我们使用“哨兵”来解决这个问题。
  我们这里说的哨兵也是解决“边界问题”的,不直接参与业务逻辑。在任何时候,不管链表是不是空,head 指针都会一直指向这个哨兵结点。我们也把这种有哨兵结点的链表叫带头链表。相反,没有哨兵结点的链表就叫作不带头链表。

4.重点留意边界条件处理
  在编写完一段代码后,我们需要对边界问题进行检查,以保证代码的稳定性。那么链表的边界条件有以下几个:

  • 如果链表为空
  • 如果链表只宝行一个结点
  • 如果链表只宝行两个结点
  • 代码逻辑在处理头结点和尾结点的情况

5.举例画图,辅助思考
  在实现每一个复杂需求之前,最好先通过画图的形式梳理整个逻辑流程,然后看图写代码就会容易很多。而且遇到bug时,解决起来也会方便很多。

6.多写多练
  多些多练,孰能生巧。几个常见的链表操作。

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

以上只是对链表操作进行的技巧总结,剩下的就是实战敲代码练习了。

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

数据结构与算法--02链表-如何轻松写出链表代码 的相关文章

  • 《最重要的事,只有一件》读书笔记

    背景 每天都在忙忙碌碌中度过 xff0c 感觉到很累 xff0c 但仔细思考一下好像也没有收获 仔细想一想 xff0c 在每天之中 xff0c 大脑主动或被动的接受了太多的信息 xff0c 如果没有给信息分出轻重缓急 xff0c 整理归类
  • table合并单元格colspan和rowspan

    span style font family none code span style background color rgb 255 255 0 span style font family none code span style f
  • jQuery两个稳定版本的比较

    jquery历经了多个版本的更新 xff0c 版本上的比较貌似没什么必要性 xff0c 一般来说新的版本会比旧的版本各方面都略有提升 xff0c 但由于新版中增加了各种新的功能 xff0c 难免会引起bug的发生 评估一个版本是否适合当前开
  • 室内定位简介

    室内定位定义 xff1a 室内定位是指在室内环境中实现位置定位 xff0c 主要采用无线通讯 基站定位 惯导定位等多种技术集成形成一套室内位置定位体系 xff0c 从而实现人员 物体等在室内空间中的位置监控 室内定位需求 xff1a 在室外
  • 命令行提交代码到gitLab服务器

    1 创建项目 xff0c 前提是gitLab服务器已经搭建完成 xff0c 在gitLab个人账户下创建一个项目 xff0c 项目名称自己定义 xff0c 如图 xff1a 2 拷贝本地代码到指定目录 xff0c 一般自己创建一个固定的代码
  • VS 附加到进程调试技巧

    有些时候碰到自己开发的程序嵌入到别人的框架中 xff0c 而在接口的地方出了问题 xff0c 而又不方便将自己的模快加入到别人的工程中 有很多相关的文件 xff0c 还有mster页面等 xff0c 这个时候VS的附加到进程调试变得不可或缺
  • Request和Response详解

    Request 和 Response 对象起到了服务器与客户机之间的信息传递作用 Request 对象用于接收客户端浏览器提交的数据 xff0c 而 Response 对象的功能则是将服务器端的数据发送到客户端浏览器 一 Request对象
  • 人最宝贵的东西是生命

    钢铁是怎样炼成的 人最宝贵的东西是生命 生命属于人只有一次 一个人的生命是应该这样度过的 当他回首往事的时候 他不会因虚度年华而悔恨 也不会因碌碌无为而羞耻 这样在临死的时候 他才能够说 39 我的生命和全部的经历 都献给世界上最壮丽的事业
  • 树莓派卡在开机界面循环要求输入密码,提示cannot currently show the desktop

    这个必须得记录下来 xff0c 太坑了 昨天树莓派用着好好的 xff0c 突然就拷贝ssh拷贝东西进去拷贝不成功 xff0c VNC登陆图形界面 xff0c 输入密码后又循环弹出输入密码解密 xff0c 还提示 cannot current
  • FreeRTOS----debug之任务的挂起和恢复实验,任务无法切换

    任务的挂起和恢复 debug xff1a 背景 xff1a 有两个Task Task1为LED闪烁任务 Task2为挂起恢复LED任务 调试程序遇到的问题 xff1a LED灯闪烁任务不能正常执行 一直常亮 原因 xff1a LED闪烁任务
  • 提高IT运维效率,深度解读京东云AIOps落地实践(异常检测篇)

    基于深度学习对运维时序指标进行异常检测 xff0c 快速发现线上业务问题 时间序列的异常检测是实际应用中的一个关键问题 xff0c 尤其是在 IT 行业 我们没有采用传统的基于阈值的方法来实现异常检测 xff0c 而是通过深度学习提出了一种
  • Android getResources的作用和需要注意点

    今天做一个Android的文件管理器 xff0c 里面用到很多的地方用到了getResources Drawable currentIcon 61 null currentIcon 61 getResources getDrawable R
  • Mac OS X 的包管理器 HomeBrew

    Homebrew 是最简单和灵活的方式 xff0c 用来在 Mac OS X 安装 Linux 工具包 Homebrew 国内高速安装脚本 xff1a HomebrewCN Homebrew 国内安装脚本 安装过程很简单 xff1a rub
  • Android中Parcelable的原理和使用方法

    Parcelable的简单介绍 介绍Parcelable不得不先提一下Serializable接口 xff0c Serializable是Java为我们提供的一个标准化的序列化接口 那什么是序列化呢 进行Android开发的时候 xff0c
  • 小米路由器安装mt工具箱

    去年六月底的时候在小米路由3上开启了ssh 安装了mt工具箱 现在回头看来 xff0c 开启ssh的方法已经大相径庭 不过 xff0c 今天的主角换成了小米路由器pro半个月前替换掉原来的小米路由3 那么 xff0c 肯定也是要在小米路由器
  • SSD的随机读能力 和一个高访问量的读写服务系统

    昨天晚上写了个代码 xff0c 测试了下目前我这个1000块钱的SSD的随机读能力 主机配置 i5 4核 两物理核 8G内存 linux 内核版本 2 6 18 128 el5 一个50G的文件 gt gt 8G内存 防止全缓存至内存中 p
  • 系统过载及保护的思考

    家用电器为了防止电流过大 xff0c 都会有保险装置 当电流过大时 xff0c 自动切断电流 xff0c 防止电器损坏 防洪大坝的水位超过了警戒线 xff0c 会开闸泄洪 xff0c 防止大坝崩溃 而我们的服务系统如果一旦流量过大 用户或请
  • 系统调用,上下文切换及中断概念的汇总

    仔细揣摩了一段时间 系统调用和上下文切换 1 1 首先每个进程都拥有两个堆栈 用户态栈和内核态栈 1 2 每CPU变量中会有两个栈单独用于中断过程 分别用于每个独立核的软中断和硬中断 2 6 x版本后 1 3 系统调用过程 进程进入内核态
  • 吞吐量和延时

    某单机计算秘钥的服务 cpu bound 4核 xff0c 接受网络req 最大吞吐10万 s xff0c 4核cpu均达到99 以上 当吞吐达到10万 s时 xff0c 对于单个req延时是多少 xff1f 假设服务有个队列 xff08
  • io wait

    准确的说iowait只是表示在统计CPU空闲周期时间片内 xff0c 有多少时间在等待IO执行 xff0c 反应的是IO设备的性能 这里CPU并不会等待IO xff0c 但是相应的 操作IO的线程或者进程需要等到IO操作完成 以下是man

随机推荐

  • 技术的变革

    最近几个月陆续接触和使用了pinpoint spring cloud 构建一个成熟的分布式环境已经越来越简单了 系统的统计和监控也越来越容易了 特别是pinpoint 完全不要侵入业务逻辑 技术的发展真是可怕
  • 系统的分类

    我所接触过的系统可以分为5类 1 以关系数据库为主要存储的一类系统的 xff0c 或者附加少量数据的noSql的存储 xff0c 特点是逻辑复杂 xff0c 多变 如各类业务类系统 xff0c 传统的信息系统 中小型电商系统的各类业务系统
  • android倒计时功能的实现(CountDownTimer)

    在逛论坛的时候 xff0c 看到一个网友提问 xff0c 说到了CountDownTimer这个类 xff0c 从名字上面大家就可以看出来 xff0c 记录下载时间 将后台线程的创建和Handler队列封装成一个方便的类调用 查看了一下官方
  • 【STM32】几款常用产品(F1、F4、F7)的区别

    STM32系列单片机 xff0c 是目前极为常用的单片机 xff0c 它以ARM Cortex M为内核 xff0c 具有高性能 低成本 低功耗 可裁剪等特点 其中使用最广泛的是STM32F1 STM32F4 STM32F7系列 xff0c
  • VMware虚拟机看不到共享目录

    VMware虚拟机看不到共享目录 确认VMtools已经装好 xff0c 开启共享文件夹 xff0c 设置好共享目录执行命令 sudo mount t vmhgfs host mnt hgfs 如果出现错误 xff1a Error cann
  • 【Linux基础】Makefile基础入门

    基础Makefile规则和样例展示 基础的makefile样例 目标 xff1a 依赖 命令 单文件编译 mian o main c gcc c mian c o mian 多文件编译 mian o main c mian h includ
  • Json基础

    Json是什么 JSON 或者 JavaScript 对象表示法是一种轻量级的基于文本的开放标准 xff0c 被设计用于可读的数据交换 约定使用 JSON 的程序包括 C xff0c C 43 43 xff0c Java xff0c Pyt
  • STM32 BOOT引起硬件死机

    STM32的三种启动方式依靠BOOT0和BOOT1两个引脚的电平来决定 xff0c ST官方推荐的是串联10k电阻然后在接高电平或接地 我用0R直接接地的 xff0c 没有串联10k电阻 xff0c 造成STM32的硬件死机 在实际的应用中
  • 远程 sshd提示:Server unexpectedly closed network connection

    root 64 xx vim etc ssh sshd config 修改端口为3330 root 64 xx iptables I INPUT p tcp dport 3330 j ACCEPT 添加防火墙3330端口 允许 root 6
  • linux驱动开发流程和方法

    方法一 xff1a 将驱动编入内核的方法 手把手教你写第一个Linux驱动程序 https blog csdn net morixinguan article details 54620088 方法二 xff1a 简单实例讲解linux的m
  • Ubuntu 出现apt-get: Package has no installation candidate问题解决办法

    apt get install tftpd tftp openbsd inetd 提示apt get Package has no installation candidate 解决方法如下 xff1a 先检查虚拟机网络是否NAT模式 xf
  • Vim/gVim 中文显示为乱码的解决办法

    打开vimrc文件 xff0c 在vim的安装目录下可以找到该文件 xff0c 或在windows下是在vim gvim下输入 edit vim vimrc 在文件的末尾添加一句 set fileencodings 61 utf 8 gbk
  • 关于字,半字,字节之间的关系

    一直搞不清楚字 xff0c 半字 xff0c 字节之间的关系 xff0c 查了一下资料 xff0c 明白了 字 xff0c 半字 xff0c 字节 大小是根据不同的操作系统来说的 xff0c 32位系统 字 gt 32bit 半字 gt 1
  • android json解析及简单例子

    JSON的定义 xff1a 一种轻量级的数据交换格式 xff0c 具有良好的可读和便于快速编写的特性 业内主流技术为其提供了完整的解决方案 xff08 有点类似于正则表达式 xff0c 获得了当今大部分语言的支持 xff09 xff0c 从
  • vim-plug的使用方法

    vim plug介绍 Vim plug 是一个自由 开源 速度非常快的 并行地安装或更新插件 xff0c 极简的 vim 插件管理器 GIT获取和安装 https git scm com 插件获取 https github com june
  • .NetCore swagger发布到iis时访问api出现404的解决方案

    介绍 使用netcore作为纯后端提供api已经变得越来越频繁 xff0c swagger也成为很多人的选择 通常会在代码中限制ASPNETCORE ENVIRONMENT为Production时关闭swagger 但是往往我们需要将api
  • 新手树莓派4B安装Supervised+Home Assistant及问题解决

    测试平台 xff1a 树莓派4B 4G 系统版本 xff1a Raspberry Pi OS with desktop and recommended software Release date September 22nd 2022 Sy
  • 无人机高精度定位之——RTK与PPK概念扫盲

    无人机高精度定位之 RTK与PPK概念扫盲 无人机的兴起 xff0c 已经让很多行业激动不已 xff0c 如电力巡检 应急救援 测绘 农业植保等行业 而随着高精度卫星导航技术的加持 xff0c 让无人机定位更加高效 安全 灵活 xff0c
  • 数据结构与算法--01数组:为什么大多编程语言中数组从0开始编号?

    数据结构与算法 01数组 xff1a 为什么很多编程语言中数组从0开始编号 xff1f 一 数组特性二 数组访问越界问题三 数组与容器四 回到开篇五 总结 一 数组特性 1 数组本质上是一种线性表数据结构 xff0c 用一组连续的内存空间来
  • 数据结构与算法--02链表-如何轻松写出链表代码

    数据结构与算法 02链表 如何轻松写出链表代码 写好链表并不是件容易的事情 xff0c 尤其是一些复杂的链表操作 xff0c 如链表反转 有序链表合并等等 即使能够写出代码 xff0c 但及其容易出错 所以付出一定量的精力是前提条件 xff