刷題筆記 鍊錶相關

2021-10-06 18:29:01 字數 1585 閱讀 6486

輸入乙個鍊錶,反轉鍊錶後,輸出新鍊錶的表頭。

分析:初始時,將 pren 指向 nullptr,curn 指向鍊錶首部,提前記錄好鍊錶的下乙個節點。為了反轉鍊錶,要將 curn 的 next 指標指向 pren。

class

solution

return curn;}}

;

輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點。

分析:設定兩個指向鍊錶首部的指標,快指標先移動 k 步,隨後快慢指標一起移動,直到快指標指向鍊錶尾部後乙個結點,此時慢指標指向的就是倒數第 k 個結點。

class

solution

while

(fast)

return slow;}}

;

輸入兩個單調遞增的鍊錶,輸出兩個鍊錶合成後的鍊錶,當然我們需要合成後的鍊錶滿足單調不減規則。

//非遞迴版本

class

solution

else

headptr = headptr-

>next;

}

headptr-

>next = phead1?phead1:phead2;

return head-

>next;}}

;//遞迴版本

/**/

class

solution

else}}

;

給乙個鍊錶,若其中包含環,請找出該鍊錶的環的入口結點,否則,輸出null。

分析:第乙個想法是將遍歷到的節點指標一一新增到 set 中,第乙個重複的節點就是環的入口結點了。

判斷鍊錶中是否有環可以使用快慢指標,但怎麼判斷入口結點呢?快慢指標相遇前,快指標已經在環中轉了至少 1 圈,而慢指標進入環內的第 1 圈就會與快指標相遇,也就是說快慢指標相遇時,快指標比慢指標多走了 n 個環(n>=1)。

如圖,假設鍊錶起始節點 a 距環入口結點 b 長度為 x,而慢指標在環內走了長度 y 後與快指標相遇在 c 節點(由前面的分析可知,環長度l>y>=0)。在這個過程中慢指標走了 x+y,快指標速度是慢指標的 2 倍,所以快指標走了 2x+2y。這時由圖我們可以推斷出:x = nl+(c->b)。如果此時我們讓快指標定位到起始結點,並以與慢指標同樣的速度沿鍊錶運動,則當快指標到達環入口結點 b 時,慢指標也恰好到達 b 點,快慢指標再次相遇。

注意鍊錶無環、鍊錶起始節點即為環入口節點幾種特殊情況。

/*

struct listnode

};*/

//解法一:用set記錄已遍歷過的節點

class

solution

return phead;}}

;//解法二:快慢指標

class

solution

fast = phead;

while(1

)return fast;}}

;

陣列,鍊錶相關刷題彙總

難度,簡單 思路1 由於是找和為target的兩個元素,所以相當於是遍歷這個nums,然後看是否存在 target nums i 最暴力方法就是直接兩層迴圈,但是可以借助map來進行實現,第乙個int是元素,第二個值是下標 class solution 沒找到就放進map mp.insert mak...

演算法題 鍊錶相關

題目 請編寫乙個函式,使其可以刪除某個鍊錶中給定的 非末尾 節點,你將只被給定要求被刪除的節點。解析 由於只輸入了需要刪除的節點node,因此無法獲取刪除節點node的前乙個節點pre,從而也就無法將前乙個節點pre指向刪除節點的下乙個節點nex 既然無法通過修改指標完成,那麼肯定要修改鍊錶節點的值...

鍊錶相關程式設計題 Python

從尾到頭列印鍊錶 鍊錶中倒數第k個結點 class solution def findkthtotail self,head,k write code here if not head return none pfast,pslow head,head for i in range k if pfa...