資料結構鍊錶刷題思路總結

2021-10-10 17:54:51 字數 2640 閱讀 8465

最近刷了一些關於鍊錶的題目,所以也在此進行一下總結鍊錶資料結構中主要會用到的一些方法。

在鍊錶的題目中,經常會用到頭插法,具體的做法就是新建乙個指標指向一塊空白的記憶體,然後將原指標指向的鍊錶,乙個個插入到我們新建的指標後面。

listnode* newhead =

newlistnode()

;while

(l1)

上面的**是對頭插法的乙個簡單步驟總結,最後我們會獲得原鍊錶的倒序,不過需要注意的是,此時newhead指向的是我們新建的記憶體空間,而不是我們想要的原鍊錶的最後一塊,如果要使newhead直接指向原鍊錶最後一塊,只要簡單的使它等於自身的next即可。

newhead = newhead-

>next;

用到頭插法的鍊錶題有206反轉鍊錶、445鍊錶求和,這些題目都要求了從末位到首位進行計算,所以很容易就能想到用頭插法。

遞迴法無論是在鍊錶題中,還是在其他的資料結構題目中,都是一種很好的解題思路,因為遞迴法使我們只需要將思路侷限於部分,就可以解決整體的問題,所以也是演算法題的萬能解法了。做遞迴的題目需要思考以下幾個步驟,遞迴的終止條件是什麼,遞迴每一步需要進行什麼處理,遞迴需要對上一層返回什麼值。

拿21題合併兩個有序鍊錶來舉例,題目要求對兩個公升序的鍊錶進行合併為一條鍊錶,這條鍊錶中同時也保持公升序。

/**

* definition for singly-linked list.

* struct listnode

* listnode(int x) : val(x), next(nullptr) {}

* listnode(int x, listnode *next) : val(x), next(next) {}

* };

*/class

solution

else}}

;

我們只關注傳入函式的兩個節點l1和l2,那麼在遞迴過程中,我們需要做的無非就是對這兩個節點進行排序,很容易想到比較它們的值,比較完值之後,我們不能把val大的節點直接放在val小的節點之後,因為還不確定val大的節點是否小於val小的節點的next的val,所以就需要遞迴呼叫這個函式,再將next與val大的節點進行比較,最後返回的就是這個val小的節點。那麼終止條件應該是什麼呢?可以想到比到最後肯定有l1或l2為nullptr的情況,所以我們只需要在一方為nullptr的情況下返回另外乙個即可,不可能兩者都為nullptr,因為這種情況在上一層函式中就已經應該返回了。

快慢指標法適用於我們要找鍊錶中的特殊位置的時候,比如說我們需要找鍊錶中倒數第二個位置,就可以讓快指標先走2步,然後慢指標再指向頭部,接下來兩者一起向後走,等到快指標的next指向nullptr時,慢指標的next也就指向倒數第二節點位置,如下面的**所示。

/**

* definition for singly-linked list.

* struct listnode

* listnode(int x) : val(x), next(nullptr) {}

* listnode(int x, listnode *next) : val(x), next(next) {}

* };

*/class

solution

if(fast==

nullptr

)return head-

>next;

while

(fast-

>next!=

nullptr

) slow-

>next = slow-

>next-

>next;

return head;}}

;

剩下比較常規的方法就是遍曆法,對於一條鍊錶按照特定的順序進行遍歷,在這個過程中對鍊錶進行處理,得到最終需要的鍊錶順序,這種題目一般都是對鍊錶直接進行處理,不需要新建節點。

如下面的328奇偶鍊錶題,題目要求將奇數節點連在一起,偶數節點連在一起,然後再在奇數節點的末尾連上偶數節點,還是很容易想到使用遍歷方法,分別處理奇數節點和偶數節點的。

/**

* definition for singly-linked list.

* struct listnode

* listnode(int x) : val(x), next(nullptr) {}

* listnode(int x, listnode *next) : val(x), next(next) {}

* };

*/class

solution

listnode* odd = head;

listnode* even = head-

>next;

listnode* evenhead = head-

>next;

while

(even!=

nullptr

&&even-

>next!=

nullptr

) odd-

>next = evenhead;

return head;}}

;

leetcode刷題 資料結構(1) 鍊錶

鍊錶 1.找出兩個鍊錶的交點 第一次可做出,解法可優化 2.鍊錶反轉 遞迴 迭代 兩種方法 3.歸併兩個有序的鍊錶 可做出經典題型,兩種方法需掌握 4.從有序鍊錶中刪除重複節點 第一次可做出ok 5.刪除鍊錶的倒數第 n 個節點 第一次可做出ok 6.交換鍊錶中的相鄰結點 思考後可做出 解法可簡化 ...

ACM刷題之路(十三)資料結構 鍊錶

順序表之後是鍊錶,鍊錶是線性表的第二種結構。單 鍊錶根據 資料結構 這本書 需要會寫初始化 插入 查詢 刪除 取長度的函式。首先是結構體的定義 typedef的意思是取別名。把lei這個小名 給int 修改線性表資料型別的時候可以直接改動 typedef int lei struct ss 第乙個是...

資料結構 鍊錶 總結

總體來說鍊錶的簡單題還是比較好做的,就是好久沒敲 有些手有點生,開始有些不會敲了,但是慢慢就覺得比起以前acm的題完全不是乙個檔次。但是做題後我發現雖然是水題,但是卻也不是分分鐘能a的,必須經過一定的推理過程,而且做題可以加深對鍊錶的理解,比如說以前我將頭尾節點的概念看的太重,動不動就覺到要想訪問鍊...