【力扣-链表】4、两两交换链表中的节点(24)

113 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

24. 两两交换链表中的节点

给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。

你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

示例 1:

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

示例 2:

输入: head = []
输出: []

示例 3:

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

图解:

    交换一次的流程图

图片.png

CODE:

#include <iostream>

using namespace std;

/**
 * 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) {}
 * };
 */

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);
        dummy->next = head;
        // 当前指针指向虚拟头节点
        ListNode *cur = dummy;

        // 向后遍历交换节点
        while (cur->next != nullptr && cur->next->next != nullptr)
        {
            // 记录每次需要交换的第一个节点(共记录两个)
            ListNode *tmp = cur->next;
            ListNode *tmp1 = cur->next->next->next;
            // 步骤1
            cur->next = cur->next->next;
            // 步骤2
            cur->next->next = tmp;
            // 步骤3
            cur->next->next->next = tmp1;
            
            // 交换一次完成,更新cur指针指向的位置
            cur = cur->next->next;
        }

        // 交换完位置后删除虚拟头节点
        head = dummy->next;
        delete dummy;
        return head;
    }

    void printListNode(ListNode *head)
    {
        ListNode *cur = head;
        while (cur)
        {
            cout << cur->val << " ";
            cur = cur->next;
        }
        cout << endl;
    }
};

int main()
{

    ListNode *head = new ListNode(1);
    ListNode *p1 = new ListNode(2);
    ListNode *p2 = new ListNode(3);
    ListNode *p3 = new ListNode(4);
    head->next = p1;
    p1->next = p2;
    p2->next = p3;

    Solution solu;
    ListNode *newHead = solu.swapPairs(head);
    solu.printListNode(newHead);

    return 0;
}

图片.png