力扣24:两两交换链表中的节点

力扣24:两两交换链表中的节点

题目

给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。

思路

思路1:递归

想要完成交换我们先考虑一下什么情况下不再需要交换了,很明显就是没有节点了或者只剩下一个节点也就是节点数量分别为偶数和奇数的情况。那么我们再来想一下两个节点p->q完成交换后的next分别都是什么内容,p的next是后续完成交换的节点所以我们可以使用递归来一层一层的设置p的next,而q的next就很简单就是p。

思路2:迭代

想要正常交换两个节点我们必须知道前置节点,所以显而易见我们可以设置一个哨兵节点来当作前置节点之后就慢慢的进行一次一次的交换直到最后没有节点或者只有一个节点

代码

递归

cpp 复制代码
/**
 * 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;
        }
        //p->q
        ListNode* newhead = head->next;//q
        head->next = swapPairs(newhead->next);//p->next
        newhead->next = head;//q->next
        return newhead;
    }
};

迭代

cpp 复制代码
/**
 * 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* dummyhead = new ListNode(0);
        dummyhead->next = head;
        ListNode* tmp = dummyhead;
        //没有节点或者只有一个节点
        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 dummyhead->next;
    }
};