Bootstrap

C++ 刷题笔记_10 两两交换链表中的节点

提示:力扣第24题

题目

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

示例:
在这里插入图片描述
输入:head = [1,2,3,4]
输出:[2,1,4,3]


提示:以下是本篇文章正文内容,下面案例可供参考

解题思路

总的就是:模拟过程,改变指针指向;

  • 使用虚拟头结点,这样会方便很多,要不然每次针对头结点(没有前一个指针指向头结点),还要单独处理;
  • 接下来就是交换相邻两个元素了,此时一定要画图,不画图,操作多个指针很容易乱,而且要操作的先后顺序
    在这里插入图片描述

题解

代码如下(示例):

#include<iostream>
#include<vector>

using namespace std;
/*两两交换链表中的节点*/

struct LinkedNode{
    int val;
    LinkedNode *next;
    LinkedNode(int x):val(x),next(nullptr){}
    LinkedNode(int x,LinkedNode *next):val(x),next(next){}
};//节点结构体

class Solution{
public:
    LinkedNode *changelist (LinkedNode *head)//两两交换链表节点的函数
    {
        LinkedNode *_dummyHead = new LinkedNode(0);//定义虚拟头结点
        _dummyHead->next = head;//使虚拟头节点指向链表真实的头节点
        LinkedNode *cur = _dummyHead;//定义个指针cur
        while(cur->next != nullptr && cur->next->next != nullptr)
        {
            LinkedNode *tmp = cur->next;//tmp、tmp1保存节点
            LinkedNode *tmp1 = cur->next->next->next;

            cur->next = tmp->next;//步骤1
            tmp->next->next = tmp;//步骤2
            tmp->next = tmp1;//步骤3

            cur = cur->next->next;//cur移动两位,准备下一轮的交换
        }
        LinkedNode *res = _dummyHead->next;//去掉虚拟头节点
        delete _dummyHead;
        _dummyHead = nullptr;
        return res;
    }
    void printflist (LinkedNode *head)//打印链表
    {
        LinkedNode *cur = head;
        while(cur != nullptr)
        {
            cout << cur->val <<" ";
            cur = cur->next;
        }
        cout << endl;
    }
};

int main(void)
{
    Solution s;
    LinkedNode *tail = new LinkedNode(4);
    LinkedNode *c = new LinkedNode(3,tail);
    LinkedNode *b = new LinkedNode(2,c);
    LinkedNode *a = new LinkedNode(1,b);
    s.printflist(a);//自定义链表:1,2,3,4并打印出来
    LinkedNode *head =  s.changelist(a);//将自定义链表放入交换函数得到交换后的函数
    s.printflist(head);//打印
    return 0;
   
}

运行结果:
在这里插入图片描述


总结

对链表的使用更加深刻。继续加油

;