提示:力扣第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;
}
运行结果:
总结
对链表的使用更加深刻。继续加油