《算法基础》——3.5 链表算法

简介:

本节书摘来自华章计算机《算法基础》一书中的第3章,第3.5节,作者:(美)罗德·斯蒂芬斯(Rod Stephens)著,更多章节内容可以访问云栖社区“华章计算机”公众号查看

3.5 链表算法

到目前为止,本章描述了一些用于建立和维护链表的算法,包括在链表的开头、结尾和中间添加项的算法,查找链表中项的算法和从链表中删除项的算法。
以下各节描述了利用其他方式来操作链表的算法。
3.5.1 复制链表
一些算法重新排列链表。本节和下一节将描述一些对链表中的项进行排序的算法。如果想保持原来链表的顺序,就必须在排序之前就做一个该链表的副本。
下面的伪代码演示了如何复制一个单链表:
screenshot
screenshot

该算法相当简单,但有一点值得一提:该算法使用last_added来跟踪最新被加入到链表副本中的单元格。当要把一个项插入到链表中时,该算法将last_added.Next指向一个新的单元格对象。这使新的对象在该链表的末尾。然后该算法更新last_added以指向新单元格并将原始单元格的值赋予它。
这允许链表从底部而不是从顶部增长。如果如同3.10节“练习1”中的所描述的那样:跟踪链表的最后一个项,类似于如何轻松地将项添加到链表的末尾。
3.5.2 链表的插入排序
在第6章中谈到了许多关于排序的算法,但是其中有两种算法值得在这里进行讨论:选择排序(我们将在下一节中进行描述)和插入排序。
排序算法的基本思想是把一个单元格从待输入链表中提取出来,并将其插入到一个已经排好序的链表(其最初开始是空的)中的适当位置。
下面的伪代码展示了插入排序算法,这里的待排序的各个单元格被存储在一个具有top哨兵的单向链表中:
screenshot
screenshot

该算法开始通过建立一个空的链表来保存排序的输出。然后,它从一个无序的输入链表的头至尾进行循环。对于每个输入单元格,算法遍历前面已经排好序的链表来找到一个新单元格对应的位置。然后,它把新单元格插入。
如果调用之前的3.2.6节中描述的插入单元格算法InsetCell,可以简化代码。
如果输入链表中的单元格已经按照从大到小的顺序排列好,该算法只需用短短的几个步骤就可以实现从链表开头插入一个新单元格。如果链表保存N个单元格,在新的链表中插入的所有项总共需要O(N)的步骤。这是该算法的最佳情况。
如果在输入链表中单元格已经从小到大排序,这种算法必须从新的链表的末尾插入每个单元格。而对于每次插入一个链表都需要查找已有链表的末尾单元格。因此,插入所有项需要1+2+3+…+N=N×(N+1)÷2=O(N2)的步骤。
在平均情况下,要插入的项是随机排列的,该算法可以快速插入一些项,但其他项需要更长的时间。其结果是,该算法的运行时间仍然是O(N2),虽然实际上它不会需要最坏情况所需的时间。许多其他的排序算法只需要O(N log N)的时间,而这种算法的时间复杂度为O(N2),表现则相对缓慢。这使得该算法面对数据量较大的链表表现无力。然而,它在数据量较小的链表中运行很快,并且它适用于链表,许多其他的算法并不适用于链表。

相关文章
|
算法
【❤️算法笔记❤️】-每日一刷-19、删除链表的倒数第 N个结点
【❤️算法笔记❤️】-每日一刷-19、删除链表的倒数第 N个结点
329 1
|
算法 索引
❤️算法笔记❤️-(每日一刷-141、环形链表)
❤️算法笔记❤️-(每日一刷-141、环形链表)
239 0
|
算法
【❤️算法笔记❤️】-(每日一刷-876、单链表的中点)
【❤️算法笔记❤️】-(每日一刷-876、单链表的中点)
221 0
|
算法
【❤️算法笔记❤️】-每日一刷-23、合并 K 个升序链表
【❤️算法笔记❤️】-每日一刷-23、合并 K 个升序链表
215 0
|
存储 算法
【❤️算法笔记❤️】-每日一刷-21、合并两个有序链表
【❤️算法笔记❤️】-每日一刷-21、合并两个有序链表
374 0
|
存储 机器学习/深度学习 算法
C 408—《数据结构》算法题基础篇—链表(下)
408考研——《数据结构》算法题基础篇之链表(下)。
540 30
|
存储 算法 C语言
C 408—《数据结构》算法题基础篇—链表(上)
408考研——《数据结构》算法题基础篇之链表(上)。
800 25
|
存储 监控 算法
员工电脑监控系统中的 C# 链表算法剖析-如何监控员工的电脑
当代企业管理体系中,员工电脑监控已成为一个具有重要研究价值与实践意义的关键议题。随着数字化办公模式的广泛普及,企业亟需确保员工对公司资源的合理利用,维护网络安全环境,并提升整体工作效率。有效的电脑监控手段对于企业实现这些目标具有不可忽视的作用,而这一过程离不开精妙的数据结构与算法作为技术支撑。本文旨在深入探究链表(Linked List)这一经典数据结构在员工电脑监控场景中的具体应用,并通过 C# 编程语言给出详尽的代码实现与解析。
252 5
|
存储 算法 物联网
解析局域网内控制电脑机制:基于 Go 语言链表算法的隐秘通信技术探究
数字化办公与物联网蓬勃发展的时代背景下,局域网内计算机控制已成为提升工作效率、达成设备协同管理的重要途径。无论是企业远程办公时的设备统一调度,还是智能家居系统中多设备间的联动控制,高效的数据传输与管理机制均构成实现局域网内计算机控制功能的核心要素。本文将深入探究 Go 语言中的链表数据结构,剖析其在局域网内计算机控制过程中,如何达成数据的有序存储与高效传输,并通过完整的 Go 语言代码示例展示其应用流程。
252 0
|
存储 监控 算法
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
在数字化办公时代,公司监控上网软件成为企业管理网络资源和保障信息安全的关键工具。本文深入剖析C++中的链表数据结构及其在该软件中的应用。链表通过节点存储网络访问记录,具备高效插入、删除操作及节省内存的优势,助力企业实时追踪员工上网行为,提升运营效率并降低安全风险。示例代码展示了如何用C++实现链表记录上网行为,并模拟发送至服务器。链表为公司监控上网软件提供了灵活高效的数据管理方式,但实际开发还需考虑安全性、隐私保护等多方面因素。
293 0
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨

热门文章

最新文章