62

我了解链表的定义,但它如何表示并与一个共同的概念或项目相关联?

例如,OOP 中的组合(编辑:最初说“继承”)可能与汽车有关。现实生活中的所有(大多数)汽车本质上都是一样的。汽车有一个引擎,你可以启动()它,你可以让汽车去(),停止()等等。汽车通常具有最大载客量,但在公共汽车和跑车之间会有所不同,这两种汽车都是汽车。

是否有一些真实的、直观的简单的 ole' 单链表示例,就像我们在继承中所拥有的那样?典型的教科书链接列表示例显示了一个带有整数的节点和指向下一个的指针,它似乎并不是很有用。

感谢您的意见。

4

32 回答 32

58

链表就像康加舞线。每个人都握着前面人的臀部,臀部依次由人向后握着,只有前面和后面的人除外。将人员添加到线路中的唯一方法是找到正确的位置并解耦该连接,然后插入新的人员或人员。

于 2009-03-13T19:25:02.487 回答
49

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

链表有点像寻宝游戏。你有一条线索,这条线索有一个指向位置的指针,可以找到下一条线索。所以你去下一个地方,得到另一条数据,和另一个指针。要在中间或最后得到一些东西,唯一的方法是从头开始遵循这个列表(或作弊;))

于 2009-03-13T19:27:42.170 回答
41

什么是链表的一个实际的、真实的例子?

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

火车车厢按特定顺序连接,以便以最有效的方式装载、卸载、转移、下车和取车。

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

现在,我们可以停下火车,卸下每节车厢的货物,然后让火车继续行驶,但是火车上的其他所有东西都必须坐好,同时将面粉从沉箱中吸出,然后是糖等。

取而代之的是,这些车厢是按顺序装载在火车上的,以便可以将整个车厢拆下,而火车的其余部分则继续行驶。

火车的末端比中间的部分更容易分离,并且比在一个地方分离几节车厢,在另一个地方分离几节车厢要容易得多。

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

很像一个链表。

-亚当

于 2009-03-13T19:37:30.880 回答
19

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

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

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

因此,任何可用于数组的类比(飞机的所有引擎,购物清单上的所有物品......)也适用于链表,但考虑到效率可能适合进行另一个类比:

数组将是书柜中的盒子。当你从第 n 行移除盒子时,所有从 n+1 向上的盒子都需要向下移动一个架子(这样你就没有麻烦的空架子了)。

相反,链表将是一条项链。当你发现你不再喜欢那颗蓝色宝石时,将它从序列中取出,并将结果的两端绑在一起。无需循环穿过每颗珍珠并将其移开,这样您就可以修复您的项链。

于 2009-03-13T19:31:42.300 回答
15

在柜员/收银员等处排队等候...

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

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

于 2009-03-13T19:11:23.393 回答
12

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

例如:

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

它现在对你来说似乎有点无用,但几年后,问自己同样的问题,你会发现自己惊讶于你曾经想知道它会在哪里使用。

编辑: 我在您的一条评论中注意到您询问指针为何重要。有人正确地回答说,指针对链表的用户并不重要。用户只想要一个包含事物列表的列表。该列表如何“包含”该列表对用户来说并不重要。指针是“如何”的一部分。想象一条线,画在地板上,通向出纳员。人们需要站在那条线上才能找到出纳员。那条线是(我承认,这有点牵强)链表使用的指针的类比。排队的第一个人,在出纳员处,是名单的负责人。排在他们后面的人是列表中的下一个。最后,队列中的最后一个人是列表的尾部。

于 2009-03-13T19:15:14.587 回答
12

现实生活中的例子:

**1) 单链表**

  1. 一个孩子的人脑(为了记住一些东西,例如。诗他必须把它链接起来,如果你问他最后一行,他必须从第一行开始阅读)
  2. 网络上的消息传递(消息被分成数据包,每个数据包都有下一个数据包的密钥,因此在接收者端,很容易将它们组合在一起)

2)双向链表

  1. 脱氧核糖核酸分子
  2. 允许使用 BACK 按钮的浏览器缓存。
  3. 火车教练与下一个和以前的教练相连。
  4. 自行车滚子链(双向链表)

3) 循环链表

  1. 自动扶梯
  2. 调度程序在操作系统中的进程调度过程中使用的时间共享问题。
  3. 多人棋盘游戏
于 2016-09-14T06:30:38.870 回答
10

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

首先,图形用户界面的人因产品不工作而受到指责。他检查了他的代码,发现这不是他的错:API 搞砸了。API 人员检查他的代码:不是他的错,这是记录器模块的问题。记录器模块的人现在责备数据库的人,谁责怪安装人员,谁责备......

于 2010-03-12T09:14:41.913 回答
8

你的 DNA 分子是双链表。

于 2010-03-12T09:01:25.180 回答
8

链条:

替代文字

特别是滚子链:

替代文字

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

于 2010-03-12T09:21:28.747 回答
6

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

于 2009-03-13T19:13:20.563 回答
6

在一般情况下,链表是您将遇到的最有用的东西之一。

现实世界的例子:

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

  • 你的瓷器柜里的一堆盘子——一种特殊的 LL,称为“堆栈”。

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

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

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

于 2009-03-13T20:29:11.600 回答
5

人脑可以是链表的一个很好的例子。在背诵某些东西的初始阶段自然的过程是将一个项目链接到下一个项目。这是一种潜意识的行为。让我们以抢劫8 行 Wordsworth's Solitary Reaper为例:

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) 查找,您可以在其中从任何地方挑选行。

于 2014-07-06T12:35:06.607 回答
5

链表可用于实现队列。典型的现实生活示例将是收银员的一条线。

链表也可用于实现堆栈。锥形真实 ife 示例将是自助餐厅中的盘子分配器之一,其中将顶盘从堆叠顶部拉出。

于 2009-03-13T19:17:49.540 回答
5

单链表的一些例子。

  1. Microsoft Word、Paint 等任何应用程序的撤消按钮:状态链接列表。
  2. GPS 导航:地图数据的链接列表。从起点到终点的旅行是遍历所有节点的示例。GPS 重新路由是地图数据的添加和删除操作的一个示例。

双链表的一些例子。

  1. 浏览器的下一个和上一个按钮:URL 的链接列表
  2. Microsoft Image Viewer 的下一个和上一个按钮:图像的链接列表
  3. Photoshop 的撤消和重做按钮,状态链接列表。
于 2016-09-02T22:35:07.340 回答
2

我对这个问题的第一反应是“环顾四周!这种东西无处不在!” 但是想了一会儿,我想不出任何不做作的例子。

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

我认为您在寻找真实世界示例时遇到困难的原因是链接部分是一个编程工件,一个实现细节。以编程方式实现列表的方法有很多,一种好的方法是让每个列表项都知道它的邻居。另一种方法是使用一个 List 对象来跟踪项目及其顺序。这就是大多数列表在现实生活中的工作方式。在上面的示例中,杂货清单的 List 对象将是它所写的纸(或其他任何东西)。

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

于 2009-03-13T19:49:49.230 回答
2

双向链表的最佳和直接示例是Train!

在此处输入图像描述

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

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

于 2013-10-23T13:54:13.293 回答
1

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

于 2009-03-13T19:25:07.760 回答
1

给出行进方向:方向上的每一步都是一个节点,每个节点之间的行进指令就是你的链接。

例子:

节点 1:从家里开始

链接:向南步行 3 个街区到鲍勃的家

节点 2:鲍勃的房子

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

节点 3:爱丽丝的房子

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

于 2009-03-13T19:25:33.937 回答
1

在 .NET BCL 中,该类System.Exception有一个名为 的属性InnerException,它指向另一个异常,否则就是null. 这形成了一个链表。

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

于 2009-03-13T19:19:46.807 回答
1

看一个链表:

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

这是...火车!每个火车车厢都包含一些东西并连接到另一辆火车车厢(或者最后一个没有)。您只能在最后添加一辆有轨电车,如果您想摆脱一辆,您必须将前一辆与下一辆连接起来。

于 2009-03-13T20:00:04.603 回答
1

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

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

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

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

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

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

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

于 2009-03-13T20:06:02.093 回答
1

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

  • 有未知或可变数量的项目
  • 项目按顺序排列,如列表
  • 项目可能会被重新排列,添加到中间列表中,在中间列表中删除,等等。

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

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

于 2009-03-13T20:42:57.370 回答
1

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

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

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

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

为什么要为此使用 LinkedList?

  1. 从列表中添加/删除项目的操作速度很快。
  2. 您不知道有多少 IP 将被阻止/列入白名单。因此,揭示了 LinkedList 的主要优势之一(它是可调整大小的)。
于 2013-10-05T02:14:44.767 回答
1

好吧,如果一个老师带他的学生去看卡通电影,但她找不到座位,她会让学生记住下一个学生的地址(座位号)等等……这样她就不会回去的时候遇到麻烦!!!

于 2011-09-19T20:13:55.470 回答
1

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

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

于 2010-03-12T09:11:31.317 回答
1

我认为没有一个很好的类比可以突出与数组相反的两个重要特征:1. 在当前项目之后插入效率高,2. 通过索引查找特定项目效率低。

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

当您处理较小的馆藏时,您可以直观地找到所需的项目,或者,对于图书馆中的书籍,您将拥有一个类似字典的组织。

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

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

于 2015-12-04T22:25:24.940 回答
0

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

请注意,每个盒子可以包含多个隔间,其中包含箭头(指针)和信息(数据)。

于 2013-08-18T08:40:27.720 回答
0

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

于 2009-03-13T19:31:26.123 回答
0

我喜欢把循环链表想象成一条珍珠项链,每颗珍珠都包含一些数据。您只需跟随字符串到下一个数据珍珠,最终您会再次回到开头。

于 2009-03-13T19:13:57.443 回答
0

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

于 2012-05-07T07:29:55.793 回答
0

他们一直在儿童学前班这样做。当他们在户外的路上或类似的地方时,每个孩子都被要求握住其他几个孩子的手。每个孩子都知道他或她应该握住谁的手。他们就这样过马路。我认为这是一个典型的双向链表示例。

于 2016-05-24T16:19:39.287 回答