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,然後將當前結點賦值給上一節...