【資料結構·考研】求解連結串列問題的雙指標法
阿新 • • 發佈:2021-01-10
技術標籤:考研程式設計-線性表單鏈表連結串列指標
1、返回倒數第 k 個節點
連結串列就是用線穿起來的一串珠子,求解連結串列問題最常用的就是雙指標法乃至三指標法。
實現一種演算法,找出單向連結串列中倒數第 k 個節點。返回該節點的值。
注意:本題相對原題稍作改動
示例:
輸入: 1->2->3->4->5 和 k = 2
輸出: 4
說明:給定的 k保證是有效的。
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/kth-node-from-end-of-list-lcci
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
int kthToLast(ListNode* head, int k) { ListNode* p = head; ListNode* q = head; //指標q先向後移動k個位置 while(k --) q = q->next; //兩個指標同時向後移動,當q指向空時,p指向倒數第k個結點 while(q != NULL){ q = q->next; p = p->next; } //返回p所指結點的值 return p->val; }
執行結果:
2、環形連結串列
給定一個連結串列,判斷連結串列中是否有環。
如果連結串列中有某個節點,可以通過連續跟蹤 next 指標再次到達,則連結串列中存在環。 為了表示給定連結串列中的環,我們使用整數 pos 來表示連結串列尾連線到連結串列中的位置(索引從 0 開始)。 如果 pos 是 -1,則在該連結串列中沒有環。注意:pos 不作為引數進行傳遞,僅僅是為了標識連結串列的實際情況。
如果連結串列中存在環,則返回 true 。 否則,返回 false 。
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/linked-list-cycle著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
bool hasCycle(ListNode *head) {
ListNode* fast = head;
ListNode* slow = head;
while(fast != NULL && fast->next != NULL) {
slow = slow->next;
fast = fast->next->next;
// 快慢指標相遇,說明有環
if (slow == fast) return true;
}
return false;
}
執行結果:
3、相交連結串列
編寫一個程式,找到兩個單鏈表相交的起始節點。
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
int lengthA=0;
int lengthB=0;
ListNode*p=headA;
ListNode*q=headB;
while(p!=NULL) {p=p->next;lengthA++;}
while(q!=NULL) {q=q->next;lengthB++;}
p=headA;
q=headB;
int len=lengthA-lengthB;
int i=abs(len);
//相交的結點後的部分是相同的
while(i--){
if(len>=0) p=p->next;
else q=q->next;
}
while(p!=q){
p=p->next;
q=q->next;
}
return p;
}
執行結果: