什么是链接列表的一个实际的,真实世界的例子?

我理解链接列表的定义,但是它又如何expression和与一个共同的概念或项目相关?

例如,OOP中的组合(EDIT:原来说的“inheritance”)可能与汽车有关。 现实生活中的所有(大多数)汽车都是基本相同的东西; 一辆汽车有一台发动机,你可以开始()它,你可以让汽车去(),停止()等等。 汽车通常具有最大的乘客容量,但在汽车和公共汽车之间会有所不同。

是否有一些现实生活,直觉的例子,就像我们inheritance的一样? 典型的教科书“链接列表”示例显示了一个带有整数和指向下一个的指针的节点,它看起来不是很有用。

您的意见是赞赏。

链表就像康加系列一样 。 每个人都拥有在他们面前的人的臀部,他们的臀部轮stream在后方,除了在前面和后面的人。 将人员添加到线路的唯一方法是find正确的位置并将该连接分开,然后插入新的人员或人员。

我假设你想要一个比书本定义更隐喻的解释,而不是如何使用链表的例子。

链表就像一个寻找清道夫。 你有一个线索,这个线索有一个指针来寻找下一个线索。 所以你去下一个地方,并获得另一个数据,另一个指针。 要想在中间或者最后得到一些东西,唯一的办法就是从一开始就遵循这个列表(或者去欺骗)

什么是链接列表的一个实际的,真实世界的例子?

最简单最直接的就是一列火车。

火车车厢按特定的顺序连接起来,以便可以以最有效的方式装载,卸载,转移,丢弃和拾取火车。

例如,Jiffy Mix工厂需要糖,面粉,玉米面等。弯曲处可能需要一个需要氯气,硫酸和氢气的造纸厂。

现在,我们可以停下火车,把每辆车的内容物卸下,然后让火车继续行驶,但是火车上的其他东西都要坐下来,面粉被吸出沉箱,然后是糖等等。

取而代之的是,汽车被装上火车,以便其中的一大块可以分开,剩下的火车继续前进。

火车的尾端比中间的部分更容易拆卸,而且比在一个地方拆卸几辆汽车,在另一个地方拆卸几辆汽车要容易得多。

但是,如果需要,您可以在列车中的任意位置插入和移除物品。

很像链接列表。

-亚当

在出纳员/收银员等候线…

一系列必须按顺序执行的命令。

任何FIFO结构都可以实现为链表。

首先要理解的是,链表在概念上与数组相同。

唯一的区别在于各种操作的效率 。 最重要的是:

  • 中间插入:O(1)为列表,O(n)为数组。
  • 直接访问中间的元素:O(n)用于列表,O(1)用于数组。

因此,任何可以用于数组的类比(飞机的所有引擎,购物清单上的所有项目…)也适用于链表,但效率的考虑可以使其适用于另一个类比:

一个数组可以放在书架上 。 当你从第n行取出盒子时,从n + 1起的所有盒子都需要移动一个盒子(所以你没有麻烦的空架子)。

一个链表,反过来说,将是一个项链 。 当你发现你不再喜欢那个蓝色的gem时,把它从序列中拿出来,把结果两端连在一起。 没有必要循环通过每颗珍珠,并取代它,所以你可以修理你的项链。

我记得,多年前,在我的第一个大学课程之一,想知道我会永远使用一个链表。 今天,我不认为有一个项目在我没有使用过的地方,而且在很多地方。 这是一个令人难以置信的基础数据结构,相信我,它在现实世界中被大量使用。

例如:

  • 在医疗成像应用程序中需要刻录到CD的图像列表
  • 一个网站的用户列表,需要通过电子邮件发送一些通知
  • 3D游戏中需要渲染到屏幕上的对象列表

现在对你来说可能看起来有些无用,但几年之后,问自己同样的问题,你会发现自己惊讶于你想知道它将被用在哪里。

编辑:我注意到你的意见之一,你问为什么指针很重要。 有人正确地回答说,指针对链表的用户无关紧要。 用户只需要一个列表,其中包含一个事物列表。 该列表如何“包含”该列表对用户而言并不重要。 指针是“如何”的一部分。 想象一下,在地板上划出一条通往出纳员的线路。 人们需要站在这条线上才能到达出纳员。 该行是一个(我承认,这是一个有点拉伸)类比的链接列表使用的指针。 第一个在出纳员上线的人就是名单的负责人。 直接在他们后面的人是列表中的下一个人。 最后,行中的最后一个人就是列表的尾部。

链条:

替代文字

特别是滚子链:

替代文字

链条的每个元素都连接到它的后继者和前辈。

你的DNA分子是双链表。

如果你仔细想想,“链接”只是一种识别数据实例之间的“下一个”,“上一个”,“子”或“父”关系的方法 因此,在真实世界的应用程序中,您可以find各种各样的应用程序。 想一个简单的列表(例如购物清单)的基本链接列表。 但也要考虑我们可以放置图的用途(绘制地图上城市之间的距离,生物学中物种之间的相互作用)或树(组织中的层次结构或数据库索引中的数据,用于两个非常不同的示例)。

Blame在一个项目的不同模块上工作的一群软件工程师,

首先,graphics用户界面的人被指责为产品无法正常工作。 他检查他的代码,发现这不是他的错:API正在搞砸。 API人员检查他的代码:不是他的错,这是logging器模块的问题。 logging器模块的家伙现在责怪数据库的家伙,谁指责安装人员,谁指责…

在一般情况下,链表是你会遇到的最恶劣有用的事情之一。

现实世界的例子:

  • 一群排队排队的人 – 一种特殊的LL叫做“排队”。

  • 中国橱柜里的一大堆菜 – 一种特殊的LL叫“堆”。

  • “取一个号码”这一行(数字必须在某个时刻从“1”开始) – 一种称为“循环队列”的特殊types的LL。

一般来说,我喜欢用于几乎所有链接数据结构的隐喻都是一副扑克牌 。 几乎任何你可以用链表进行的事情,你都可以使用一副牌来形象化。 这对于显示一些更深奥的sortingalgorithm中发生的事情特别方便。

我个人最喜欢的: Bogosort =玩52卡取代,直到你的牌组sorting。 🙂

真实生活的例子:

** 1)单链表**

  1. 一个孩子的人脑(为了记住一些东西,例如诗,他必须把它连起来,如果你问他最后一行,他必须从第一行读到)
  2. 在networking上发送消息(消息被分解成数据包,每个数据包都有一个下一个密钥,这样在接收端就可以很容易地把它们分开)

2)双向链表

  1. DNA分子
  2. 允许使用BACKbutton的浏览器caching。
  3. 火车教练与下一个和前一个连接。
  4. 自行车滚子链(双环链表)

3)循环链表

  1. 自动楼梯
  2. 调度程序在调度操作系统中的进程时使用的时间共享问题。
  3. 多玩家棋盘游戏

人脑可以是链表的一个很好的例子。 在心中学习的初始阶段,自然的过程是把一个项目与下一个项目联系起来。 这是一个潜意识的行为。 我们举个例子来说明八个华兹华斯的孤独收割者

Behold her, single in the field, Yon solitary Highland Lass! Reaping and singing by herself; Stop here, or gently pass! Alone she cuts and binds the grain, And sings a melancholy strain; O listen! for the Vale profound Is overflowing with the sound. 

我们的头脑不像一个有利于随机访问的数组。 如果你问那个家伙最后的线路是什么 ,他会很难说。 他将不得不从第一线去那里。 如果问他第五行是什么更难。

同时,如果你给他一个指针,他会前进。 好吧,从Reaping and singing by herself;开始Reaping and singing by herself; ?。 现在变得更容易了。 如果你能给他两条路线,那就更容易了, Alone she cuts and binds the grain, And sings a melancholy strain; 因为他更好地获得stream量。 同样的,如果你什么都不给他,他将不得不从一开始就拿到线 。 这是经典的链表。

类比中应该很less出现exception,这可能不太合适,但是这有点解释了链表是如何工作的。 一旦你变得精通一点,或者知道这首诗从内到外,链接列表会滚动(大脑)到一个散列表或数组中,这有助于O(1)查找,在这里你可以从任何地方select线条。

我对这个问题的第一反应是“环顾四周!这东西无处不在!” 但是经过一番思考,我想不出有什么不可思议的例子。

链表的概念是一个复合的概念,一个双重的。 你有一个列表的概念,这是没有问题的。 一个购物清单,例如。 然后你到达链接部分。 一个杂货店不知道下一个杂货店,所以模型崩溃了。

我认为你find真实世界的麻烦的原因是链接部分是一个编程工件,一个实现细节。 有很多方法来实现列表编程方式,一个好办法是让每个列表项知道它的邻居。 另一种方法是有一个List对象来跟踪项目及其顺序。 这是大多数列表在现实生活中的工作方式。 在上面的例子中,购物清单的List对象就是写在纸上的文件(或其他)。

一般考虑列表可能更有用,查看链表只是列表的具体实现。

一个链表可以用来实现一个队列 。 典型的现实生活中的例子将是一个收银员的线。

链表也可以用来实现一个堆栈 。 具有真正意义的真实例子是在自助餐厅的那些盘子分配器之一,在盘子顶部拉顶板。

提供旅游方向:指导中的每一步都是一个节点,每个节点之间的旅行指示都是您的链接。

例:

节点1:在家开始

链接:向南走3个街区到Bob's House

节点2:鲍勃的房子

链接:向北走2个街区到爱丽丝之家。

节点3:爱丽丝的房子

如果你想从一个地方到另一个地方,你必须遵循来自每个中间地点(节点)的链接(指示),你不能只是从家里跳到爱丽丝的地方。

看一个链表:

[A] => [B] => [C] => [D] =>

这是…火车! 每辆铁路车厢都装有一些东西,并且连接到另一辆铁路车厢(或者是最后一辆)。 你只能在最后加一辆铁路车,如果你想摆脱一辆车,你必须将前一辆车与下一辆车相连。

电话链直接作为链表实现。 这是如何工作的:

  1. 小组组织者收集所有成员的电话号码。

  2. 组织者为每个成员分配另一个成员的号码。 (有时他们会分配自己的号码,以便他们知道消息已经通过,但这是可选的。)

  3. 当需要发送消息时,组织者调用列表头并传递消息。

  4. 头部呼叫他们分配的号码并传递消息。

  5. 重复步骤4,直到每个人都听到了该消息。

显然必须注意在步骤2中设置列表,以便每个人都链接。 此外,清单通常是公开的,所以如果有人收到应答机或忙音,他们可以拨打下一个电话号码,并保持链条移动。

链表与一摞文件非常相似,每个文件上都有一个项目。 (而不是数组,就像pegboards。)它通常用于解决这些特点的问题:

  • 有一个未知的或可变的项目数量
  • 这些项目是按顺序排列的,就像列表一样
  • 项目可能会重新排列,添加到列表中,列表中删除等。

重新排列一个简单的数组是一个痛苦,在确保数组有足够的内存的同时,在中间的某个地方添加一个元素是一个痛苦。 通过链表,这些操作很简单。 假设您想将项目#10移动到项目#2和项目#3之间。 随着文件,你可以捡起来,移动它。 有了一个数组,你必须将项目3到9移动到一个插槽中,然后将其放入。使用链接列表,你可以这样做:告诉9它后面的那个是11,告诉2它是10之后的那个,告诉10它是3之后。

我现在正在使用其中的几个,因为添加项目是多么容易,并以编程方式说“对列表中的每个项目执行此操作”。 其中之一是条目列表,就像电子表格一样。 另一方面,我通过查看第一个列表并添加对每个具有特定值的项目的引用,以便我可以对它们执行批处理操作。 能够从中间抽取物品,或将其添加到中间,而不必担心数组长度。 这些是我的经验的主要优势。

好,如果一个老师带他的学生去看一个卡通片,但是她不能坐在一起,她会让学生记住下一个学生的地址(座位号),等等……这样她就不会有面临麻烦,而回头!

他确实要求一个实际的例子。 所以我会给它一个镜头:

比方说你正在写一个防火墙; 在这个防火墙中你有一个IP白名单和一个IP黑名单。

你知道你的IP,你的工作IP和一些testingIP需要被列入白名单。 所以,你把所有的IP添加到白名单。

现在,你也有一个应该被阻止的已知IP列表。 所以,你将这些IP添加到黑名单。

为什么可以使用LinkedList呢?

  1. 该操作是快速添加/删除列表中的项目。
  2. 您不知道有多lessIP将被阻止/列入白名单。 因此,揭示了LinkedList的一个主要优点(可resize)。

双链表的最好和直接的例子是火车!

在这里输入图像说明

这里每个教练都连接到它的上一个和下一个教练(除了第一个和最后一个)

在编程方面考虑主体为数据(值)节点和连接器为参考节点。

我喜欢想象一个像珍珠项链的圆形链表,每颗珍珠都含有一些数据。 你只要按照string的下一个数据珍珠,最终你最终在一开始。

在.NET BCL中, System.Exception类具有一个名为InnerException的属性,该属性指向另一个exception,否则为null 。 这形成一个链表。

System.TypeBaseType属性以相同的方式指向另一个types。

make程序里面,你会经常发现需要构build的特定文件的依赖项列表被定义为指向其他文件的链接列表,这些文件也需要被构build,并且依次在链接列表中。

查看链接列表作为数据结构。 这是在OOD中表示自我聚合的机制。 你可以把它看作是真实的世界对象(对某些人来说是现实)

在操作系统中…可以使用链表来跟踪哪些进程正在运行,哪些进程正在hibernate…进程正在运行并想要hibernate…从跟踪运行的LinkedList中被移除进程,一旦睡眠时间结束,将其添加回活动进程LinkedList

也许更新的操作系统正在使用一些时髦的数据结构…链表可以在那里使用

链表的一个很好的例子就是你的文本信息,其中一个信息包可以被分成几个信息包。 每个数据包都有一个连接到下一个密钥和第n个密钥的密钥,使得包含密钥和数据的整个文本消息成为可能。

考虑2个或更多箱子有2个或更多的车厢。 (在这个例子中每个箱子将有2个隔间)第一个隔间将包含一些信息。 一个数字或一个字。 第二个隔间将保持一个指向下一个方框的箭头,依此类推。

注意每个盒子可以包含含有箭头(指针)和信息(数据)的多重隔间。

我不认为有一个很好的比喻可以突出两个重要的特征,而不是一个数组:1.有效的插入在当前项目之后,2.低效地通过索引find特定的项目。

没有这样的事情,因为通常人们不会处理大量需要插入或定位特定项目的项目。 例如,如果你有一袋沙子,那将会是数以亿计的谷物,但是你不需要定位一个特定的谷物,而谷物的顺序并不重要。

当你处理较小的藏品时,你可以直观地find需要的物品,或者在图书馆藏书的情况下,你会有一个类似学术的组织。

最接近的比喻是有一个盲人穿过链条,项链上的珠子,火车车厢等链接项目。他可能正在寻找特定物品或需要插入一个项目之后。 可以很好地补充一下,盲人可以很快地经过它们,例如每秒钟一百万个珠子,但是一次只能感觉到一个环节,看不到整个环节或其中的一部分环节。

请注意,这个比喻类似于一个双链表,我不能想象类似于单链接的类比,因为有一个物理连接意味着能够回溯。