微博分享的網(wǎng)站怎么做亞洲衛(wèi)星電視網(wǎng)參數(shù)表
為什么需要手寫實現(xiàn)數(shù)據(jù)結(jié)構(gòu)?
其實技術(shù)的本身就是基礎(chǔ)的積累和搭建的過程,基礎(chǔ)扎實 地基平穩(wěn) 萬丈高樓才會久戰(zhàn)不衰,做技術(shù)能一通百,百通千就不怕有再難得技術(shù)了。
一:鏈表的分類
主要有單向,雙向和循環(huán)鏈表的展示形式。
1:單向鏈表
單鏈表包含具有數(shù)據(jù)字段的節(jié)點以及指向節(jié)點行中的下一個節(jié)點的“下一個”字段。可以對單鏈表執(zhí)行的操作包括插入、刪除和遍歷。
2:雙向鏈表
在“雙向鏈表”中,除了下一個節(jié)點鏈接之外,每個節(jié)點還包含指向序列中“前一個”節(jié)點的第二個鏈接字段。這兩個鏈接可以稱為’前‘ 和’后’,或’下’和’上’。
3:循環(huán)列表
在列表的最后一個節(jié)點中,鏈接字段通常包含一個空引用,一個特殊的值用于指示缺少進一步的節(jié)點。一個不太常見的約定是讓它指向列表的第一個節(jié)點。在這種情況下,列表被稱為“循環(huán)”或“循環(huán)鏈接”;否則,它被稱為“開放”或“線性”。它是一個列表,其中最后一個指針指向第一個節(jié)點。
所以我們在學(xué)習(xí)的過程中,以使用 Java 程序員本身常用的語言來分析學(xué)習(xí),并通過簡化結(jié)構(gòu)的方式把 LinkedList 手寫實現(xiàn),讓友友們更能方便的理解鏈表。
以下為實戰(zhàn)過程
A:鏈表的節(jié)點
鏈表的數(shù)據(jù)結(jié)構(gòu)核心根基就在于節(jié)點對象的使用,并在節(jié)點對象中關(guān)聯(lián)當(dāng)前節(jié)點的上一個和下一個節(jié)點。通過這樣的方式構(gòu)建出鏈表結(jié)構(gòu)。
但也因為在鏈表上添加每個元素的時候,都需要創(chuàng)建新的 Node 節(jié)點,所以這也是一部分耗時的操作
B:頭插節(jié)點
B1.1:先把頭節(jié)點記錄下來。之后創(chuàng)建一個新的節(jié)點,新的節(jié)點構(gòu)造函數(shù)的頭節(jié)點入?yún)閚ull,通過這樣的方式構(gòu)建出一個新的頭節(jié)點。
B1.2:原來的頭結(jié)點,設(shè)置 f.prev 連接到新的頭節(jié)點,這樣的就可以完成頭插的操作了。
C: 尾插節(jié)點
尾差節(jié)點與頭插節(jié)點正好相反,通過記錄當(dāng)前的結(jié)尾節(jié)點,創(chuàng)建新的節(jié)點,并把當(dāng)前的結(jié)尾節(jié)點,通過 l.next 關(guān)聯(lián)到新創(chuàng)建的節(jié)點上。
D:拆鏈操作
此方法比較難懂 給大家上圖
unlink 是一種拆鏈操作,只要你給定一個元素,它就可以把當(dāng)前這個元素的上一個節(jié)點和一個節(jié)點進行相連,之后把自己拆除。
這個方法常用于 remove 移除元素操作,因為整個操作過程不需要遍歷,拆除元素后也不需要復(fù)制新的空間,所以時間復(fù)雜讀為 O(1)
E:刪除元素
刪除元素的過程需要 for 循環(huán)判斷比刪除元素的值,找到對應(yīng)的元素,進行刪除。
最后測試用例走一波
附贈經(jīng)典面試題:
描述一下鏈表的數(shù)據(jù)結(jié)構(gòu)?
Java 中 LinkedList 使用的是單向鏈表、雙向鏈表還是循環(huán)鏈表?
鏈表中數(shù)據(jù)的插入、刪除、獲取元素,時間復(fù)雜度是多少?
什么場景下使用鏈表更合適?
友友們在評論區(qū)寫下你們的答案!
以上的是線性數(shù)據(jù)結(jié)構(gòu)-手寫鏈表-LinkList 若需完整代碼 可識別二維碼后 給您發(fā)代碼。