-
快慢指針(主要解決鏈表中的問題)
- 鏈表中是否包括環,進而求鏈表中環的入口節點
- 鏈表的中間節點(重要作用就是對鏈表進行歸併排序)
- 鏈表的倒數第k個節點
- 等等
-
左右指針(主要解決數組(或者字符串)中的問題)
- 二分查找
- 求排序樹組中和爲sum的兩個數
- 反轉數組(字符串)
- 滑動窗口(雙指針技巧的最高境界)
- 等等(代碼就不寫了,前面寫過)
快慢指針常用算法
// 1、快慢指針判斷鏈表是否包含環並且返回環的入口節點
ListNode* hasCycle(ListNode* pHead){
ListNode* fast = pHead;
ListNode* slow = pHead;
while(fast != nullptr && fast->next != nullptr){
fast = fast->next->next;
slow = slow->next;
if(fast == slow)
break;
}
// 沒有環則返回
if(fast == nullptr && fast->next == nullptr)
return nullptr;
slow = pHead;
while(slow != fast){
slow = slow->next;
fast = fast->next;
}
return fast;
}
// 2、鏈表的中間節點
ListNode* middleNode(ListNode* pHead){
if(pHead == nullptr)
return nullptr;
ListNode* fast = pHead;
ListNode* slow = pHead;
while(fast != nullptr && fast->next != nullptr){
fast = fast->next->next;
slow = slow->next;
}
// 有奇數個節點(fast->next == nullptr),slow剛好是中間節點,有偶數個節點(fast == nullptr),slow是中間偏右一個節點
return slow;
}
// 3、鏈表的倒數第k個節點(這裏簡化一下加入鏈表節點大於k個)
ListNode* lastOfKthNode(ListNode* pHead){
if(pHead == nullptr || k == 0)
return nullptr;
ListNode* fast = pHead;
ListNode* slow = pHead;
// 先讓快指針走k個節點
while(k--)
fast = fast->next;
while(fast != nullptr){
slow = slow->next;
fast = fast->next;
}
return slow;
}