JZ23 (e)链表中环的入口结点
- 快慢指针
快指针一次走2步,慢指针一次走1步,直到相遇,或快指针遇到null,直接返回;
然后将快指针还原为链表头节点,快指针一次走1步,慢指针一次走1步,直到两指针相遇,相遇点即为环入口点。class Solution { public: ListNode* EntryNodeOfLoop(ListNode* pHead) { ListNode *fast=pHead, *slow=pHead; while(true){ if(!fast->next || !fast->next->next || !slow->next) return nullptr; fast=fast->next->next; slow=slow->next; if(fast==slow) break; } fast=pHead; while(true){ if(!fast->next || !slow->next) return nullptr; if(fast==slow) break; fast=fast->next; slow=slow->next; } return fast; } };
JZ22 (e)链表中倒数最后k个结点
- 快慢指针(1)
快指针先走k步,然后和慢指针一起走。 - 快慢指针(2)
快指针先开始走,当两指针之间的长度达到k之后再一起走,类似拉动铁链,铁链绷直之后头尾一起移动。class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param pHead ListNode类 * @param k int整型 * @return ListNode类 */ ListNode* FindKthToTail(ListNode* pHead, int k) { // write code here int len=0; ListNode *cur=pHead,*pre=pHead; while(true){ if(!cur) break; if(len<k){ len++; cur=cur->next; }else{ cur=cur->next; pre=pre->next; } } if(len<k) return nullptr; return pre; } };