[英]What is a practical, real world example of the Linked List?
我理解鏈接列表的定義,但它如何表示並與一個共同的概念或項目相關?
例如,OOP中的組合(EDIT:最初稱為'繼承')可以與汽車相關。 現實生活中的所有(大多數)汽車都是基本相同的東西; 汽車有一個引擎,你可以啟動()它,你可以使汽車go(),停止()等。 汽車通常具有最大乘客容量,但在公共汽車和SportsCar之間會有所不同,它們都是汽車。
是否有一些現實生活,直觀的例子,就像我們繼承的那樣,單一鏈接列表? 典型的教科書鏈接列表示例顯示了一個帶有整數和指向下一個節點的節點,它似乎不太有用。
感謝您的意見。
鏈表就像康加舞線 。 每個人都把人的臀部握在他們面前,他們的臀部輪流被人們依次握在后面,除了正面和背面的人。 將人員添加到該行的唯一方法是找到正確的位置並將該連接解耦,然后插入新的人或人。
我假設你想要一個比書定義更隱喻的解釋,而不是你如何使用鏈表的例子。
鏈表有點像尋寶者。 你有一個線索,那個線索有一個指向找到下一個線索的地方。 所以你去下一個地方獲得另一個數據和另一個指針。 要獲得中間或最后的東西,唯一的方法就是從頭開始(或欺騙;))
鏈接列表的實際現實示例是什么?
最簡單,最直接的是火車。
列車車輛按特定順序鏈接,以便可以以最有效的方式裝載,卸載,轉移,下車和拾取。
例如,Jiffy Mix工廠需要糖,面粉,玉米面等。在彎道附近可能是需要氯,硫酸和氫的紙加工廠。
現在,我們可以停下火車,卸下每輛車的內容,然后讓火車繼續行駛,但是火車上的其他東西都必須坐下,同時面粉從沉箱中吸出,然后是糖等。
相反,汽車按順序裝載在火車上,以便可以拆卸整塊火車,火車的其余部分繼續前進。
火車的末端比中間的一部分更容易分離,並且比在一個地方分離幾輛汽車和在另一個地點分離幾輛汽車容易得多。
但是,如果需要,您可以在列車的任何位置插入和移除物品。
很像鏈表。
-亞當
首先要理解的是,鏈表在概念上與數組相同。
唯一的區別在於各種操作的效率 。 最重要的是:
因此,可以用於陣列的任何類比(飛機的所有引擎,購物清單上的所有項目......)也適用於鏈表,但效率考慮因素可以使得另一個類比:
數組可以是書架中的盒子 。 當您從第n行中取出盒子時,所有來自n + 1的盒子需要向下移動一個架子(因此您沒有麻煩的空架子)。
相反,鏈表是項鏈 。 當你發現自己不再喜歡那顆藍色寶石時,請將它從序列中取出並將得到的兩端結合在一起。 無需繞過每顆珍珠並將其移位,以便您可以修理項鏈。
Blame的方式圍繞着一群在項目中處理不同模塊的軟件工程師。
首先,GUI家伙因產品無效而受到指責。 他檢查了他的代碼並發現這不是他的錯:API正在搞砸。 API人檢查他的代碼:不是他的錯,這是記錄器模塊的問題。 記錄器模塊的家伙現在責備數據庫的家伙,誰責怪安裝人員,誰責怪...
你的DNA分子是雙鏈表。
現實生活中的例子:
** 1)單鏈表**
2)雙重鏈表
3)循環鏈表
我記得很多年前,在我的第一個大學課程中,想知道我會在哪里使用鏈表。 今天,我認為沒有一個項目我在沒有使用過的地方工作,而且在很多地方。 這是一個非常基礎的數據結構,相信我,它在現實世界中被大量使用。
例如:
你現在看起來似乎有些無用,但是幾年之后,問自己同樣的問題,你會發現自己很驚訝你曾經想過它會被用在哪里。
編輯:我在你的一條評論中注意到你問到為什么指針很重要。 有人正確地回答說指針對鏈表的用戶並不重要。 用戶只需要一個包含一個事物列表的列表。 該列表如何“包含”該事項列表對用戶而言並不重要。 指針是“如何”的一部分。 想象一下畫在地板上的一條線,通向出納員。 人們需要站在那條線上才能到達出納員。 對於鏈表使用的指針,該行是(我承認,這有點拉伸)類比。 第一個人,在出納員,在線,是列表的頭。 在線上直接跟在他們后面的人是列表中的下一個。 最后,該行中的最后一個人是該列表的尾部。
如果您考慮一下,“鏈接”只是識別數據實例之間的“下一步”,“上一頁”,“子”或“父”關系的一種方式。 因此,在實際應用程序中,您將找到各種各樣的應用程序。 想想基本鏈接列表的簡單列表(例如Grocery List)。 但也要考慮我們可以放置圖形的用途(繪制地圖上城市之間的距離,生物學中物種之間的相互作用)或樹木(組織中的層次結構或數據庫索引中的數據,用於兩個非常不同的例子)。
在一般情況下,鏈接列表是您將遇到的最惡劣有用的事情之一。
現實世界的例子:
一群人排隊等候某種東西 - 一種叫做“隊列”的特殊LL。
您的瓷器櫃中的一堆餐具 - 一種特殊的LL稱為“堆棧”。
“取一個數字”行(數字必須在某個時刻以“1”重新開始) - 一種稱為“循環隊列”的特殊LL。
一般來說,我喜歡用於幾乎所有鏈接數據結構的比喻是一副牌 。 幾乎任何你可以用鏈表做的事情,你都可以用一副牌來形象化。 這對於展示自己在一些更深奧的排序算法中發生了什么特別方便。
我個人的最愛: Bogosort =玩52張卡片,直到您的牌組分類。 :-)
人腦可以是單鏈表的一個很好的例子。 在用心學習的初始階段,自然過程是將一個項目鏈接到下一個項目。 這是一種潛意識行為。 讓我們在學 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;
開始Reaping and singing by herself;
?。 現在變得容易了。 如果你能給他兩條線,那就更容易了, Alone she cuts and binds the grain, And sings a melancholy strain;
因為他得到了更好的流量。 同樣地,如果你根本不給他任何東西,他將不得不從頭開始獲得線條 。 這是經典的鏈表。
類比中應該沒有什么異常可能不合適,但這在某種程度上解釋了鏈表是如何工作的。 一旦你變得有點精通或者從里到外知道這首詩,鏈表就會滾動(大腦)到一個哈希表或數組,這有助於O(1)查找,你可以從任何地方選擇行。
我對這個問題的第一反應是“環顧四周!這東西到處都是!” 但在考慮了一下之后,我想不出任何不做作的例子。
鏈表的概念是一個復合概念,一個雙線。 你有一個列表的概念,這是沒有問題的。 例如,購物清單。 然后你到達鏈接部分。 一個雜貨項目不知道下一個雜貨項目,因此模型崩潰了。
我認為您在查找真實世界樣本時遇到問題的原因是鏈接部分是編程工件,實現細節。 有許多方法以編程方式實現列表,一種好方法是讓每個列表項了解其鄰居。 另一種方法是使用List對象來跟蹤項目及其順序。 這就是大多數列表在現實生活中的工作方式。 在上面的示例中,購物清單的List對象將是它所寫的紙張(或其他)。
也許考慮一般的列表並將鏈接列表視為列表的特定實現更有用。
他確實要求一個實際的例子; 所以我會試一試:
假設您正在編寫防火牆; 在此防火牆中,您有IP白名單和IP黑名單。
您知道您的IP,您的工作IP和一些測試IP需要列入白名單。 因此,您將所有IP添加到白名單。
現在,您還有一個應該被阻止的已知IP列表。 因此,您將這些IP添加到黑名單中。
為什么可能會使用LinkedList?
列車的雙向鏈表的最佳和直接的例子是!
這里每個教練都與前一個和下一個教練相連(除了第一個和最后一個)
在編程方面,考慮將coach body作為數據(值)節點和連接器作為參考節點。
單鏈表的一些示例。
雙鏈表的一些例子。
給出旅行方向:方向中的每個步驟都是一個節點,每個節點之間的旅行指令作為您的鏈接。
例:
節點1:從家里開始
鏈接:向南步行3個街區到Bob's House
節點2:鮑勃的家
鏈接:向北步行2個街區到愛麗絲故居。
節點3:愛麗絲的家
如果你想要一個地方到另一個地方,你必須遵循每個中間地點(節點)的鏈接(說明),你不能只是從家里跳到愛麗絲的。
查看鏈表:
[A] => [B] => [C] => [D] =>
這是......火車! 每輛鐵路車都裝有東西,並附在另一輛鐵路車上(或者最后一輛沒有任何東西)。 你最后只能添加一輛鐵路車,如果你想擺脫一輛鐵路車,你必須將前一輛車與下一輛車相連。
電話鏈直接作為鏈表實現。 以下是它的工作原理:
小組組織者收集所有成員的電話號碼。
組織者為每個成員分配一個其他成員的號碼。 (有時他們會分配自己的號碼,以便他們知道消息通過,但這是可選的。)
當需要發送消息時,組織者調用列表的頭部並傳遞消息。
頭部調用他們分配的號碼並傳遞消息。
重復步驟4,直到每個人都聽到了消息。
顯然必須注意在步驟2中設置列表,以便每個人都鏈接在一起。 此外,該列表通常是公共的,因此如果有人獲得應答機或忙音,他們可以調用下一個號碼並保持鏈移動。
鏈表非常類似於一堆文件,每個文件上都有一個項目。 (與數組相反,它類似於pegboards。)它通常用於解決具有以下特征的問題:
重新排列一個普通數組很痛苦,在中間某處添加一個元素,同時確保數組有足夠的內存等是一種痛苦。 使用鏈表,這些操作很簡單。 假設您想將項目#10移動到項目#2和項目#3之間。 有了論文,你可以拿起它並移動它。 使用數組,您必須將項目3到9移動到一個插槽中,然后將其放入。使用鏈接列表,執行此操作:告訴9后面的那個是11,告訴2后面的那個是10,在它是3后告訴10。
我現在正在使用其中的幾個,因為添加項目是多么容易,並且以編程方式說“對列表中的每個項目執行此操作”。 其中一個是條目列表,就像在電子表格中一樣。 另一方面,我通過瀏覽第一個列表並添加對具有特定值的每個項目的引用來制作,以便我可以對它們進行批處理操作。 能夠從中間采集物品,或將它們添加到中間,而不必擔心陣列長度。 這些是我經驗的主要優點。
好吧,如果一位老師帶他的學生去看卡通電影,但她無法將座位放在一起,她會要求學生記住下一個學生的地址(座位號)等......所以她不會回去時面對麻煩!!!
鏈接列表的一個很好的例子是你的文本消息,其中某個消息可以被分成幾個數據包。 每個數據包保存一個密鑰,該密鑰連接到下一個密鑰和第n個密鑰,以生成包含密鑰和數據的整個文本消息。
考慮2個或更多有2個或更多隔間的盒子。 (在這個例子中,每個盒子將有2個隔間)第一個隔間將包含一些信息。 一個數字或一個單詞。 第二個隔間將保持指向下一個框的箭頭,依此類推。
請注意,每個框可以包含多個分區,其中包含箭頭(指針)和信息(數據)。
在操作系統中......可以使用鏈接列表來跟蹤正在運行的進程以及正在處理的進程...正在運行並想要休眠的進程...從跟蹤運行的LinkedList中刪除進程,一旦休眠時間結束,就將其添加回活動進程LinkedList
也許更新的操作系統正在使用一些時髦的數據結構......可以在那里使用鏈接列表
我喜歡想到像珍珠項鏈這樣的圓形鏈表,每顆珍珠都含有一些數據。 你只需按照字符串到下一個數據珍珠,最后你就會在最后開始。
在.NET BCL中,類System.Exception
有一個名為InnerException
的屬性,它指向另一個異常,否則為null
。 這形成了一個鏈表。
在System.Type
, BaseType
屬性以相同的方式指向另一個類型。
在make
程序中,您經常會發現需要構建的特定文件的依賴關系列表被定義為指向其他文件的指針的鏈接列表,這些文件也需要構建,並依次在鏈接列表中具有依賴關系。
將Linked List視為數據結構。 它是在OOD中表示自聚合的機制。 你可能會把它想象成現實世界的對象(對某些人來說這是現實)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.