力扣刷題筆記2 鍊錶經典題目

2022-07-11 19:39:13 字數 2255 閱讀 2924

1.移除鍊錶元素

解題思路:這道題很簡單,就是從頭到尾遍歷鍊錶,如果找到val值和目標值相同的節點就刪除該節點,最後返回煉表頭節點即可

具體**如下:

2.翻轉鍊錶

解題思路:定義乙個頭指標head和尾指標node,

while(head!=node) 

迴圈結束後即完成了鍊錶的翻轉

具體**如下:

題目3:鍊錶相交

解題思路: 鍊錶相交的節點後面可以說兩個鍊錶的節點全都一樣,我們假設鍊錶a長度為6,鍊錶b長度為4,並假設兩個鍊錶後面兩位是重合部分則鍊錶a可以表示為4+2,

鍊錶b為2+2雙指標的核心思想是先分別遍歷兩個鍊錶,當乙個鍊錶遍歷完成後則去遍歷另乙個鍊錶當雙指標都停在交點時,

兩個指標遍歷過的長度分別為4+2+2=8,2+2+4=8可以看出這樣肯定能遍歷到鍊錶的交點上

具體**如下:

題目4:環形鍊錶

解題思路為:

雙指標第一次相遇: 設兩指標 fast,slow 指向鍊錶頭部 head,fast 每輪走 22 步,slow 每輪走 11 步;

第一種結果:fast 指標走過鍊錶末端,說明鍊錶無環,直接返回 null;

tips: 若有環,兩指標一定會相遇。因為每走 1輪,fast 與 slow 的間距 +1,fast 終會追上 slow;

第二種結果:當fast == slow時, 兩指標在環中 第一次相遇 。下面分析此時fast 與 slow走過的 步數關係 :

設煉表共有 a+b 個節點,其中 鍊錶頭部到鍊錶入口 有 a 個節點(不計鍊錶入口節點), 鍊錶環 有 b 個節點(這裡需要注意,a 和 b 是未知數);設兩指標分別走了 f,s 步,則有:

fast 走的步數是slow步數的 22倍,即 f = 2s;(解析: fast 每輪走 2 步)

fast 比 slow多走了 n 個環的長度,即 f = s + nb;( 解析: 雙指標都走過 aa步,然後在環內繞圈直到重合,重合時 fast 比 slow 多走 環的長度整數倍 );

以上兩式相減得:f = 2nb,s = nb,即fast和slow 指標分別走了 2n,n 個 環的周長 (注意: n 是未知數,不同鍊錶的情況不同)。

目前情況分析:

如果讓指標從鍊錶頭部一直向前走並統計步數k,那麼所有 走到鍊錶入口節點時的步數 是:k=a+nb(先走 aa 步到入口節點,之後每繞 1 圈環( b 步)都會再次到入口節點)。

而目前,slow 指標走過的步數為 nb 步。因此,我們只要想辦法讓 slow 再走 a 步停下來,就可以到環的入口。

但是我們不知道 aa的值,該怎麼辦?依然是使用雙指標法。我們構建乙個指標,此指標需要有以下性質:此指標和slow 一起向前走 a 步後,兩者在入口節點重合。那麼從**走到入口節點需要 a 步?答案是鍊錶頭部head。

雙指標第二次相遇:

slow指標 位置不變 ,將fast指標重新 指向鍊錶頭部節點 ;slow和fast同時每輪向前走 1步;

tips:此時 f = 0,s = nb ;

當 fast 指標走到f = a步時,slow 指標走到步s = a+nb,此時 兩指標重合,並同時指向鍊錶環入口 。

返回slow指標指向的節點。

具體**如下:

Python刷 力扣 鍊錶演算法題目

160.鍊錶的相交節點 我的思路是先計算出兩個列表的長度差,然後使用雙指標,長的那個先移動,然後再一起移動 class solution def getintersectionnode self,heada listnode,headb listnode listnode p1 heada p2 h...

力扣刷題筆記6 棧和佇列經典題目

題目1.刪除字串中的所有相鄰重複項 解題思路 1.分析特殊情況,當字串大小為空或者長度為1時,直接返回即可 2.將字串中的第乙個入棧,然後對後面的每乙個字元進行判斷 1 若當前的字母和棧頂的字母相同,則彈出棧頂的字母 2 若當前的字母和棧頂的字母不同,則放入當前的字母 3.最後將棧中的字元取出,組成...

力扣網刷題筆記 第206題 反轉鍊錶

題目 反轉乙個鍊錶 例項 輸入 1 2 3 4 5 null 輸出 5 4 3 2 1 null 分析 第一步 將上一結點present指向null,current指向首元結點,next指向正向鍊錶的下乙個結點。第二步 先將當前結點current指向上一結點present,然後將當前結點賦值給上一節...