1. 程式人生 > 實用技巧 >24.兩兩交換連結串列中的結點

24.兩兩交換連結串列中的結點

給定一個連結串列,兩兩交換其中相鄰的節點,並返回交換後的連結串列。

你不能只是單純的改變節點內部的值,而是需要實際的進行節點交換。

示例:
給定 1->2->3->4, 你應該返回 2->1->4->3.

遞迴

這個問題存在子問題。去掉頭兩個結點之後仍然是相同的一類問題,因此可以交換頭兩個結點,剩餘結點遞迴處理。

    ListNode* swapPairs(ListNode* head) {
        if(!head||!head->next) return head;
        ListNode*temp=head->next;
        head->next=swapPairs(head->next->next);
        temp->next=head;
        return temp;
    }

迭代

常規做法,遍歷結點。連結串列中交換結點需要同時顧前和顧後,需要有一個pre指標指向兩結點之前的一個結點

模型:pre->l1->l2->rest (l1,l2為待交換的兩個結點)

    ListNode* swapPairs(ListNode* head) {
        if(!head||!head->next) return head;
        ListNode*l1=head,*l2=head->next,*dummy=new ListNode(-1),*pre=dummy;
        while(l1&&l1->next){
            l2=l1->next;
            //交換結點
            l1->next=l2->next;
            l2->next=l1;
            pre->next=l2;
            //更新結點
            pre=l1;
            l1=l1->next;
        }
        return dummy->next;
    }

leetcode連結:https://leetcode-cn.com/problems/swap-nodes-in-pairs