leetcode #24 兩兩交換鏈表中的節點(C++)遞歸

題目:給定一個鏈表,兩兩交換其中相鄰的節點,並返回交換後的鏈表。

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

 

示例:

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

一直都不會寫遞歸,可能是沒有那個腦子嗚嗚嗚。今天強行寫了一下。下面給出兩個版本,第一個非遞歸,第二個遞歸。

 

非遞歸版本:(不要嫌棄我代碼寫的醜)

(我好難受....爲啥正不過來)

class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        ListNode* Pre, *Node, *Next, *ans;
        ListNode* PreNode = new ListNode(0);
        ans = PreNode;      //存一個返回值
        Pre = head;                  //存要交換的兩個位置的第一個元素
        Node = Pre?Pre->next:NULL;   //存要交換的兩個位置的第二個元素

        while(Node){
            /*重新建立鏈路關係*/
            Next = Node->next;
            PreNode->next = Node;
            Node->next = Pre;
            Pre->next = Next;
             
            /*更新節點位置*/
            PreNode = Pre;
            Pre = Next;
            Node = Next?Next->next:NULL;
        }
        return ans->next;
    }
};

遞歸版本:

class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        if(head == NULL || head->next == NULL)  return head; //終止條件
        ListNode* node = head->next; 
        head->next = swapPairs(head->next->next);
        node->next = head;
        return node;
    }
};

 

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/swap-nodes-in-pairs
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章