300分鐘搞定資料結構與演算法課程學習 2 列表

2021-10-05 15:42:09 字數 1632 閱讀 1950

鍊錶(linkedlist)

單鏈表:鍊錶中的每個元素實際上是乙個單獨的物件,而所有物件都通過每個元素中的引用字段鏈結在一起。

雙鏈表:與單鏈表不同的是,雙鏈表的每個結點中都含有兩個引用字段。

鍊錶的優缺點

鍊錶的優點如下:

鍊錶能靈活地分配記憶體空間;

能在 o(1) 時間內刪除或者新增元素,前提是該元素的前乙個元素已知,當然也取決於是單鏈表還是雙鏈表,在雙鏈表中,如果已知該元素的後乙個元素,同樣可以在 o(1) 時間內刪除或者新增該元素。

鍊錶的缺點是:

不像陣列能通過下標迅速讀取元素,每次都要從煉表頭開始乙個乙個讀取;

查詢第 k 個元素需要 o(k) 時間。

應用場景:如果要解決的問題裡面需要很多快速查詢,鍊錶可能並不適合;如果遇到的問題中,資料的元素個數不確定,而且需要經常進行資料的新增和刪除,那麼鍊錶會比較合適。而如果資料元素大小確定,刪除插入的操作並不多,那麼陣列可能更適合。

經典解法

鍊錶是實現很多複雜資料結構的基礎,經典解法如下。

1. 利用快慢指標(有時候需要用到三個指標)

典型題目例如:鍊錶的翻轉,尋找倒數第 k 個元素,尋找鍊錶中間位置的元素,判斷鍊錶是否有環等等。

2. 構建乙個虛假的煉表頭

一般用在要返回新的鍊錶的題目中,比如,給定兩個排好序的鍊錶,要求將它們整合在一起併排好序。又比如,將乙個鍊錶中的奇數和偶數按照原定的順序分開後重新組合成乙個新的鍊錶,鍊錶的頭一半是奇數,後一半是偶數。

在這類問題裡,如果不用乙個虛假的煉表頭,那麼在建立新鍊錶的第乙個元素時,我們都得要判斷一下鍊錶的頭指標是否為空,也就是要多寫一條 if else 語句。比較簡潔的寫法是建立乙個空的煉表頭,直接往其後面新增元素即可,最後返回這個空的煉表頭的下乙個節點即可。

建議:在解決鍊錶的題目時,可以在紙上或者白板上畫出節點之間的相互關係,然後畫出修改的方法,既可以幫助你分析問題,又可以在面試的時候,幫助面試官清楚地看到你的思路。

例題分析

leetcode 第 25 題:給你乙個鍊錶,每 k 個節點一組進行翻轉,請你返回翻轉後的鍊錶。k 是乙個正整數,它的值小於或等於鍊錶的長度。如果節點總數不是 k 的整數倍,那麼請將最後剩餘的節點保持原有順序。

說明:你的演算法只能使用常數的額外空間。

你不能只是單純的改變節點內部的值,而是需要實際的進行節點交換。

示例:給定這個鍊錶:1->2->3->4->5

當 k=2 時,應當返回:2->1->4->3->5

當 k=3 時,應當返回:3->2->1->4->5

解題思路

這道題考察了兩個知識點:

對鍊錶翻轉演算法是否熟悉

對遞迴演算法的理解是否清晰

將 curr 指向的下一節點儲存到 next 指標;

curr 指向 prev,一起前進一步;

重複之前步驟,直到 k 個元素翻轉完畢;

當完成了區域性的翻轉後,prev 就是最終的新的煉表頭,curr 指向了下乙個要被處理的區域性,而原來的頭指標 head 成為了鍊錶的尾巴。

注意:這道題是「leetcode 第 24 題,兩個一組翻轉鍊錶「的擴充套件,即當 k 等於 2 時,第 25 題就變成了第 24 題。

300分鐘搞定資料結構與演算法課程學習2 棧

棧 stack 特點 棧的最大特點就是後進先出 lifo 對於棧中的資料來說,所有操作都是在棧的頂部完成的,只可以檢視棧頂部的元素,只能夠向棧的頂部壓 資料,也只能從棧的頂部彈出資料。實現 利用乙個單鏈表來實現棧的資料結構。而且,因為我們都只針對棧頂元素進行操作,所以借用單鏈表的頭就能讓所有棧的操作...

300分鐘搞定資料結構與演算法課程學習2 佇列

佇列 queue 特點 和棧不同,佇列的最大特點是先進先出 fifo 就好像按順序排隊一樣。對於佇列的資料來說,我們只允許在隊尾檢視和新增資料,在隊頭檢視和刪除資料。實現 可以借助雙鏈表來實現佇列。雙鏈表的頭指標允許在隊頭檢視和刪除資料,而雙鏈表的尾指標允許我們在隊尾檢視和新增資料。應用場景 直觀來...

3分鐘速讀原著《Java資料結構與演算法》 二

1.簡單排序的種類 2.簡單排序之間的比較 3.小結舉例說明 在郵局經常需要去處理郵件,郵件會從下至上堆積成為乙個棧,此時處理的方式就是先處理最上面的郵件,這種方式只有能夠在合理的時間內從容處理完所有的信件,這種工作方式才不會產生太 煩,否則最底層的信件就將會永遠無法得到處理 1.棧的實戰示例 2....