1. 程式人生 > 其它 >【資料結構·考研】求解連結串列問題的雙指標法

【資料結構·考研】求解連結串列問題的雙指標法

技術標籤:考研程式設計-線性表單鏈表連結串列指標

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;
    }

執行結果: