快慢指標(初遇)

2022-05-12 08:33:33 字數 3241 閱讀 2869

資料結構書籍還沒有看完,暫時只看了一部分的《大話資料結構》,所以對鍊錶只是有點了解。

然後在leetcode每日打卡中遇到這道題————   鍊錶的中間結點)

相信這道題對於大佬甚至小白來說都是很簡單的一道題,但是我不會啊,所以就去看了一下題解,就發現了所謂的快慢指標,所以在此做一下筆記,希望各位不要嘲笑。

快慢指標就是定義兩根指標,其位置一快一慢,以此來製造出自己想要的差值。這個差值可以讓我們找到鍊錶上相應的節點以及一系列操作

對於單鏈表,每個結點只有乙個儲存下一結點的 next 指標。當我們在查詢某個結點的時候,無法和陣列一樣通過下標快速定位到待查詢的結點,只能從頭結點開始,通過每個結點的 next 指標,乙個個結點的匹配查詢。

這就代表了單鏈表迴圈的乙個特點,它在遍歷上無法後悔,遍歷走過了,就是過了,無法回頭。除非再用乙個資料結構去記錄已經遍歷的結點,那就不再是乙個單純的單鏈表了。所以當我們遇到乙個指標遍歷鍊錶不能解決問題的時候,可以嘗試用兩個指標來遍歷鍊錶。這就引發出一種解決方案,就是快慢指標,乙個指標無法完成任務,那就再引入乙個指標。它通過兩個指標 fast 和 slow 指標,讓兩個指標保持一定的間隔規律,達到我們查詢的目的。

1. 找出鍊錶的中間節點

2. 判斷鍊錶是否存在環

3. 刪除鍊錶的倒數第n的節點

4. 將有序鍊錶轉換為二叉搜尋樹

給定乙個帶有頭結點 head 的非空單鏈表,返回鍊錶的中間結點。

如果有兩個中間結點,則返回第二個中間結點。

題目描述(此為鏈結裡的leetcode題)

示例 1:

輸入:[1,2,3,4,5]

輸出:此列表中的結點 3 (序列化形式:[3,4,5])

返回的結點值為 3 。 (測評系統對該結點序列化表述是 [3,4,5])。

注意,我們返回了乙個 listnode 型別的物件 ans,這樣:

ans.val = 3, ans.next.val = 4, ans.next.next.val = 5, 以及 ans.next.next.next = null.

示例 2:

輸入:[1,2,3,4,5,6]

輸出:此列表中的結點 4 (序列化形式:[4,5,6])

由於該列表有兩個中間結點,值分別為 3 和 4,我們返回第二個結點。

思路:

用快慢兩個指標 slow 與 fast 一起遍歷鍊錶。根據兩個指標之間的間隔,來達到我們的目的,所以使slow 一次走一步,fast 一次走兩步。那麼當 fast 到達鍊錶的末尾時,slow 必然位於中間。

**:

/**

* definition for singly-linked list.

* public class listnode

* }*/

//鍊錶的中間結點

class solution

return slow;

}}

此題出自leetcode——面試題22、鍊錶中倒數第k個結點)

輸入乙個鍊錶,輸出該鍊錶中倒數第k個節點。為了符合大多數人的習慣,本題從1開始計數,即鍊錶的尾節點是倒數第1個節點。

例如,乙個鍊錶有6個節點,從頭節點開始,它們的值依次是1、2、3、4、5、6。這個鍊錶的倒數第3個節點是值為4的節點。

題目描述

示例:

給定乙個鍊錶: 1->2->3->4->5, 和  k = 2.

返回鍊錶 4->5.

思路:

讓快指標先走k步,然後兩個指標同時走到頭時,慢指標就是鍊錶倒數第k個結點;

注意點:

這題中我們需要注意,如果輸入的k大於鍊錶的結點數,需要怎樣進行判斷,如果k小於等於0,還有就是需要注意空指標的問題。

**:class solution 

listnode fast = head;

listnode slow = head;

while(k>0)else

}while(fast != null)

return slow;}}

給定乙個鍊錶,判斷鍊錶中是否有環。

如果鍊錶中有某個節點,可以通過連續跟蹤 next 指標再次到達,則鍊錶中存在環。 為了表示給定鍊錶中的環,我們使用整數 pos 來表示鍊錶尾連線到鍊錶中的位置(索引從 0 開始)。 如果 pos 是 -1,則在該鍊錶中沒有環。注意:pos 不作為引數進行傳遞,僅僅是為了標識鍊錶的實際情況。

如果鍊錶中存在環,則返回 true 。 否則,返回 false 。

出自:題目描述

示例 :

輸入:head = [3,2,0,-4], pos = 1輸出:true解釋:鍊錶中有乙個環,其尾部連線到第二個節點。

public

class

solution

listnode fast = head.next;//

fast和slow設定不一樣的值,是因為下面的迴圈,若是值一樣,迴圈在初始情況下就終止了。

listnode slow =head;

while(fast !=slow)

fast =fast.next.next;

slow =slow.next;

}return

true

; }

}

此為leetcode題——刪除排序陣列中的重複項)

給定乙個排序陣列,你需要在 原地 刪除重複出現的元素,使得每個元素只出現一次,返回移除後陣列的新長度。

不要使用額外的陣列空間,你必須在 原地 修改輸入陣列 並在使用 o(1) 額外空間的條件下完成。

題目描述:

示例:

給定陣列 nums = [1,1,2],

函式應該返回新的長度 2, 並且原陣列 nums 的前兩個元素被修改為 1, 2。

你不需要考慮陣列中超出新長度後面的元素。

思路:

可以放置兩個指標slow和fost,因為是有序陣列,所以當fost指標指向的值不等於slow指向的值時,那麼就可以將此時fost指向的值新增到此時slow指標的位置,並且將slow加一;

**:class solution 

}return fost+1;}}

初遇設計模式

今天開始學設計模式了。用的是程杰老師寫的 大話設計模式 在網上搜了一下這位老師的資料,簡單的了解一下這位大牛。那麼什麼是設計模式?design pattern 設計模式 design pattern 是一套被反覆使用 多數人知曉的 經過分類編目的 設計經驗的總結。使用設計模式是為了可重用 讓 更容易...

1 初遇貪心

以題著手,先上題。題意大致為,n堆果子,每一次合併兩堆果子為一堆,消耗的體力等於兩堆果子的重量之和。直到經過 n 1 次合併之後,就只剩下一堆了,要求消耗體力最少。例如有 3堆果子,數目依次為 1,2,9。可以先將 1 2堆合併,新堆數目為3,耗費體力為3 接著,將新堆與原先的第三堆合併,又得到新的...

初遇C語言

壹 知識總結 第二章 c資料型別 1 int定義整數量 float定義單精度浮點數量 double定義雙精度浮點數量 char定義字元型量。2 讀程式都要從main 入口,然後從最上面順序往下讀 碰到迴圈做迴圈,碰到選擇做選擇 有且只有乙個main函式。3 注釋不可以巢狀,如int a 1,int ...