1. 程式人生 > 其它 >【LeetCode】C++ :中等題 - 連結串列 24. 兩兩交換連結串列中的節點

【LeetCode】C++ :中等題 - 連結串列 24. 兩兩交換連結串列中的節點

技術標籤:LeetCode連結串列演算法leetcode

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

難度中等793

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

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

示例 1:

輸入:head = [1,2,3,4]
輸出:[2,1,4,3]

示例 2:

輸入:head = []
輸出:[]

示例 3:

輸入:head = [1]
輸出:[1]

提示:

  • 連結串列中節點的數目在範圍[0, 100]
  • 0 <= Node.val <= 100

進階:你能在不修改連結串列節點值的情況下解決這個問題嗎?(也就是說,僅修改節點本身。)

1. 迭代

這個和我想法一模一樣,可惜我自己能力還很欠缺沒能實現,原因在於,我沒有用到前驅,只用了兩個節點。

這個方法裡面用到了tmp節點相當於是前驅這樣的角色,然後每次node1 和 node2 交換後,把tmp 指向到node1 節點位置,依次進行下一個迴圈。

還有一個學習的地方,這個while迴圈的判斷條件比我寫的要嚴格。確實應該判斷的是兩個節點都不能空,我當時只判斷了第二個接地那不能空。

這個題目還是學習到了,也把自己思路和實現捋了捋。加油!

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        ListNode* dummy = new ListNode(0, head);
        ListNode* tmp = dummy;
        while(tmp->next != nullptr && tmp->next->next != nullptr){
            ListNode* node1 = tmp->next;
            ListNode* node2 = tmp->next->next;
            tmp->next = node2;
            node1->next = node2->next;
            node2->next = node1;
            tmp = node1;
        }
        return dummy->next;
    }
};

2、遞迴

這個遞迴我沒太看明白程式碼,思路是知道的,遞迴啊。。。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        if(head == nullptr || head->next == nullptr){
            return head;
        }
        ListNode* newNode = head->next;
        head->next = swapPairs(newNode->next);
        newNode->next = head;
        return newNode;
    }
};