雙指針:快慢指針。
快指針在每一步走的步長要比慢指針一步走的步長要多。快指針一般的步速是慢指針的2倍。html
在循環中的指針移動一般爲:
faster = faster.next.next; slower = slower.next;
node
是否有環:快慢指針思想,注意循環條件:(fast != null) && (fast.next != null)
spring
尋找環的入口:快慢指針相遇的時候,distance(fast指針) = 2 * distance(slow指針)
,能夠推導出,只要把fast
從新指向頭結點,兩個指針以同樣的速度走,相遇的時候,即是環的入口。數組
範圍的尋找,用2個指針:start
,end
來記錄範圍。注意循環條件和判斷條件:(end + 1 < len) && (nums[end + 1] == nums[end] + 1)
函數
Sorted List I
用兩個指針一前一後指向鏈表。維護兩個指針:指針
tail
一個指向當前不重複的最後一個元素,pCur
一個進行依次掃描,遇到不重複的則更新第一個指針,繼續掃描,不然就把前面指針指向當前元素的下一個(即把當前元素從鏈表中刪除)。Sorted List II
維護兩個指針:code
prev
前驅指針指向上一個不重複的元素pCur
遍歷指針Sorted List I
,細節更多。pCur.next != null && prev.next.val == pCur.next.val
Array
數組中的解題思想同樣:htm
index
指向上當前不重複的最後一個元素i
遍歷數組題目中含有:倒數第n個,那麼設置快指針步長爲n,而後快慢指針同時以同一速度走,用慢指針尋找倒數第n個blog
給定一個x的值,小於x都放在大於等於x的前面,而且不改變鏈表之間node原始的相對位置。example中 4->3->5都是大於等3的數,這保持了他們原來的相對位置。leetcode
使用鏈表最經常使用的雙指針:
思路:
1.利用快慢兩個指針將鏈表一分爲二;
2.針對第二個子鏈表求倒序;
3.利用merge思想將兩個子鏈表合併。
faster.next!=null && faster.next.next!=null
Two Pointers
的思想。鏈表注意構建dummy
頭結點。在Java中,因爲沒有free
函數,因此在刪除一個節點的時候,沒法用node = null
來刪除一個節點,須要用前一個節點來指向刪除節點的下一個prev.next = node.next
這樣來刪除node
節點。