链接列表的实际现实示例是什么?

时间:2009-03-13 19:09:09

标签: collections linked-list car-analogy

我理解链接列表的定义,但它如何表示并与常见概念或项目相关?

例如,OOP中的组合(EDIT:最初称为'继承')可能与汽车有关。现实生活中的所有(大多数)汽车都是基本相同的东西;汽车有一个引擎,你可以启动()它,你可以使汽车go(),停止()等。汽车通常具有最大乘客容量,但在公共汽车和SportsCar之间会有所不同,它们都是汽车。

是否存在一些现实生活,直观的例子,就像我们继承的那样?典型的教科书链接列表示例显示了一个带有整数和指向下一个节点的节点,它似乎不太有用。

感谢您的意见。

32 个答案:

答案 0 :(得分:55)

链接列表就像conga line。每个人都把人的臀部握在他们面前,他们的臀部轮流被人们依次握在后面,除了正面和背面的人。将人员添加到该行的唯一方法是找到正确的位置并将该连接解耦,然后插入新的人或人。

答案 1 :(得分:47)

我假设您想要比书籍定义更具隐喻性的解释,而不是如何使用链接列表的示例。

链表有点像寻宝者。你有一个线索,那个线索有一个指向找到下一个线索的地方。所以你去下一个地方获得另一个数据和另一个指针。要获得中间或最后的东西,唯一的方法就是从头开始(或欺骗;)

答案 2 :(得分:34)

链接列表的实际现实示例是什么?

最简单,最直接的是火车。

列车车辆按特定顺序链接,以便以最有效的方式装载,卸载,转移,下车和拾取。

例如,Jiffy Mix工厂需要糖,面粉,玉米面等。在弯道附近可能是一个需要氯,硫酸和氢的纸加工厂。

现在,我们可以停下火车,卸下每辆车的内容,然后让火车继续行驶,但是火车上的其他一切都必须坐下,而面粉从沉箱中吸出,然后是糖等。

相反,汽车按顺序装载在火车上,以便可以拆卸整块汽车,火车的其余部分继续前进。

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

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

很像链接列表。

- 亚当

答案 3 :(得分:12)

柜员/收银员等等......

必须按顺序执行的一系列订单。

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

答案 4 :(得分:12)

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

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

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

因此,可以用于阵列的任何类比(飞机的所有引擎,购物清单上的所有项目......)也适用于链表,但效率考虑因素可能适合制作另一个类比:

数组将是书架中的。当你从第n行中取出盒子时,所有来自n + 1的盒子需要向下移动一个架子(所以你没有麻烦的空架子)。

相反,链表是项链。当你发现自己不再喜欢那颗蓝色宝石时,请将它从序列中取出并将得到的两端结合在一起。 无需循环穿过每颗珍珠并取代它只是为了修复你的项链。

答案 5 :(得分:10)

Blame的方式围绕着一群在项目中使用不同模块的软件工程师。

首先,GUI家伙因产品无效而受到指责。他检查了他的代码并发现这不是他的错:API正在搞砸。 API人检查他的代码:不是他的错,这是记录器模块的问题。记录器模块的家伙现在责怪数据库家伙,谁责怪安装人员,谁责怪......

答案 6 :(得分:8)

链条:

alt text

特别是滚子链:

alt text

链中的每个元素都与其后继者和前身相连。

答案 7 :(得分:8)

很多年前,我记得在我的第一个大学课程中,想知道我会在哪里使用链表。今天,我认为没有一个项目我在没有使用过的地方工作,而且在很多地方。这是一个非常基础的数据结构,相信我,它在现实世界中被大量使用。

例如:

  • 医学影像应用中需要刻录到CD的图像列表
  • 需要通过电子邮件发送通知的网站用户列表
  • 3D游戏中需要渲染到屏幕的对象列表

现在对你来说似乎有点无用,但是几年之后,问自己同样的问题,你会发现自己很惊讶你曾经想过它会被用到哪里。

修改 我在你的一条评论中注意到你问到为什么指针很重要。有人正确地回答说指针对链表的用户并不重要。用户只需要一个包含一个事物列表的列表。该列表如何“包含”该事项列表对用户而言并不重要。指针是“如何”的一部分。想象一下画在地板上的一条线,通向出纳员。人们需要站在那条线上才能到达出纳员。对于链表使用的指针,该行是(我承认,这有点拉伸)类比。第一个人,在出纳员,在线,是列表的头。在线上直接跟在他们后面的人是列表中的下一个。最后,该行中的最后一个人是该列表的尾部。

答案 8 :(得分:8)

您的DNA分子是双链表。

答案 9 :(得分:7)

现实生活中的例子:

** 1)单链表**

  1. 一个孩子的人类大脑(为了记住一些东西,例如诗,他必须把它联系起来,如果你要问他最后一行,他将不得不从第一行阅读)
  2. 网络上的消息传递(消息被分解为数据包,每个数据包都有一个下一个密钥,因此在接收方端,很容易将它们分组)
  3. 2)双重链表

    1. DNA分子
    2. 允许使用BACK按钮的浏览器缓存。
    3. 火车教练与下一个和之前的教练有关。
    4. 自行车的滚子链(双圆链表)
    5. 3)循环链表

      1. 扶梯
      2. 调度程序在安排操作系统中的进程时使用的时间共享问题。
      3. 多人棋盘游戏

答案 10 :(得分:6)

在一般情况下,链接列表是您将遇到的最恶劣有用的事情之一。

真实世界的例子:

  • 一群排队等候的人 某种或其他 - 一种特殊的 LL称为“队列”。

  • 你中国的一摞菜 内阁 - 一种特殊的LL叫 “堆叠”。

  • “取一个数字”行(其中 数字必须重新开始 在某些时候“1”) - 一种特殊的 LL称为“循环队列”。

一般来说,我喜欢用于几乎所有链接数据结构的比喻是一副牌。几乎任何你可以用链表做的事情,你都可以用一副牌来形象化。这对于展示自己在一些更深奥的排序算法中发生了什么特别方便。

我个人最喜欢的:Bogosort =玩牌52张牌,直到你的牌组被分类。 : - )

答案 11 :(得分:6)

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

答案 12 :(得分:3)

人脑可以是链表的一个很好的例子。在学习心灵的初始阶段,自然过程是将一个项目链接到下一个项目。这是一种潜意识行为。让我们举一个例子抢劫 8行华兹华斯的孤独收割者

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; 开始?现在变得容易了。如果你能给他两行Alone she cuts and binds the grain, And sings a melancholy strain;,那就更容易了,因为他可以更好地获得流量。 同样,如果你根本不给他任何东西,他必须从头开始才能获得。这是经典的链表。

类比中应该没有什么异常可能不合适,但这在某种程度上解释了链表是如何工作的。一旦你变得有点精通或者从里到外知道这首诗,链接列表就会滚动(大脑)到一个哈希表或数组,这有助于O(1)查找,你可以从任何地方选择行。

答案 13 :(得分:2)

我对这个问题的第一反应是“环顾四周!这东西到处都是!”但在考虑了一下之后,我想不出任何没有做过的例子。

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

我认为您在查找真实世界样本时遇到问题的原因是链接部分是编程工件,实现细节。有许多方法以编程方式实现列表,一种好方法是让每个列表项了解其邻居。另一种方法是使用List对象来跟踪项目及其顺序。这就是大多数列表在现实生活中的工作方式。在上面的例子中,购物清单的List对象将是它所写的纸张(或其他)。

考虑一般列表并将链接列表视为列表的特定实现可能更有用。

答案 14 :(得分:2)

链接列表可用于实现queue。规范的现实生活中的例子将是收银员的一条线。

链接列表也可用于实现stack。例如,在自助餐厅的那些板式分配器中,其中一个是将顶板从堆叠顶部拉出来。

答案 15 :(得分:1)

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

示例:

节点1:从家里开始

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

节点2:鲍勃的家

链接:向爱丽丝之家向北步行2个街区。

节点3:爱丽丝的家

如果你想要一个地方到另一个地方,你必须按照每个中间地点(节点)的链接(说明),你不能只是从家里跳到爱丽丝的。

答案 16 :(得分:1)

单链表的一些示例。

  1. 撤消任何应用程序的按钮,如Microsoft Word,Paint等:状态链接列表。
  2. GPS导航:地图数据的链接列表。从始发地到目的地的旅行是遍历所有节点的示例。通过GPS重新路由是地图数据的添加和删除操作的示例。
  3. 双链表的一些例子。

    1. 浏览器的下一个和上一个按钮:链接的网址列表
    2. Microsoft Image Viewer的下一个和上一个按钮:图像的链接列表
    3. Photoshop的撤消和重做按钮,状态链表。

答案 17 :(得分:1)

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

enter image description here

此处每个教练都连接到其上一个和下一个教练(除了第一个和最后一个)

在编程方面,将coach body视为数据(值)节点,将连接器视为参考节点。

答案 18 :(得分:1)

他确实要求一个实际的例子;所以我会试一试:

假设您正在编写防火墙;在此防火墙中,您有IP白名单和IP黑名单。

您知道您的IP,您的工作IP和一些测试IP需要列入白名单。因此,您将所有IP添加到白名单。

现在,您还有一个应该被阻止的已知IP列表。因此,您将这些IP添加到黑名单。

为什么可以使用LinkedList?

  1. 从列表中添加/删除项目的操作很快。
  2. 您不知道有多少IP会被阻止/列入白名单。因此,揭示了LinkedList的一个主要优点(它可以调整大小)。

答案 19 :(得分:1)

好吧,如果一位老师带他的学生去看卡通电影,但她不能把座位放在一起,她会要求学生记住下一个学生的地址(座位号),等等...所以她不会回去时不得不面对麻烦!!!

答案 20 :(得分:1)

链表非常类似于一堆文件,每个文件上都有一个项目。 (与数组相反,它类似于pegboards。)它通常用于解决具有以下特征的问题:

  • 项目数量未知或可更改
  • 项目在订单中,如列表
  • 项目可能会重新排列,在中间列表中添加,在中间列表中删除等等。
重新排列一个普通数组很痛苦,在中间某处添加一个元素,同时确保数组有足够的内存等是痛苦的。使用链表,这些操作很简单。假设您想将项目#10移动到项目#2和项目#3之间。有了论文,你可以拿起它并移动它。使用数组,您必须将项目3到9移动到一个插槽中,然后将其放入。使用链接列表,执行此操作:告诉9后面的那个是11,告诉2后面的那个是10,在它是3之后告诉10。

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

答案 21 :(得分:1)

电话链直接作为链接列表实现。以下是它的工作原理:

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

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

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

  4. 负责人拨打分配的号码并传递信息。

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

  6. 显然必须注意在步骤2中设置列表,以便每个人都链接在一起。此外,该列表通常是公开的,因此如果有人获得了答录机或忙音,他们可以调用下一个号码并保持链条移动。

答案 22 :(得分:1)

查看链接列表:

[A] => [B] => [C] => [d] =>

这是......火车!每辆铁路车都装有东西,并附在另一辆铁路车上(或者最后一辆没有任何东西)。你最后只能添加一辆铁路车,如果你想摆脱一辆铁路车,你必须将前一辆车与下一辆车连在一起。

答案 23 :(得分:0)

在操作系统中......可以使用链接列表来跟踪正在运行的进程以及正在处理的进程...正在运行并想要睡眠的进程...从保留的LinkedList中删除跟踪正在运行的进程,一旦休眠时间结束,就将其添加回活动进程LinkedList

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

答案 24 :(得分:0)

我喜欢想到像珍珠项链这样的圆形链表,每颗珍珠都含有一些数据。你只需按照字符串到下一个数据珍珠,最后你最终会再次开始。

答案 25 :(得分:0)

在.NET BCL中,类System.Exception有一个名为InnerException的属性,它指向另一个例外,或者是null。这形成了一个链表。

System.Type中,BaseType属性以相同的方式指向另一种类型。

答案 26 :(得分:0)

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

答案 27 :(得分:0)

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

请注意,每个框可以包含多个分区,其中包含箭头(指针)和信息(数据)。

答案 28 :(得分:0)

make程序中,您经常会发现需要构建的特定文件的依赖关系列表被定义为指向其他文件的指针的链接列表,这些文件也需要构建,并依次具有依赖关系在链表中。

答案 29 :(得分:0)

我认为没有一个好的类比可以突出显示两个重要的特征而不是数组:1。在当前项目后插入效率高,2。按索引查找特定项目效率低。

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

当您处理较小的集合时,您可以直观地找到所需的项目,或者,如果是图书馆中的书籍,您将拥有一个类似于dictinary的组织。

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

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

答案 30 :(得分:0)

他们一直在学前班的孩子们这样做。当他们在户外路上或类似的东西时,每个孩子都被要求握住其他孩子的手。每个孩子都知道他或她应该握住谁的手。那是他们如何过马路的。我认为这是双重链表的典型例子。

答案 31 :(得分:0)

将Linked List视为数据结构。它是在OOD中表示自聚合的机制。你可能会认为它是真实世界的对象(对某些人来说它是现实)