#include<iostream>
using namespace std;
class node
{
public:
int data;
node* next;
node()
{
data = 0;
next = NULL;
}
};
class linklist
{
public:
node* head;
int len;
linklist()
{
head = NULL;
len = 0;
}
void creat(int n)
{
node* l = new node;
node* q = l;
while (n--)
{
int x;
cin >> x;
node* p = new node;
p->data = x;
q->next = p;//尾插法
q = p;
}
head = l;//链表创建完成
}
void print()
{
node* p = head->next;
while (p)
{
cout << p->data << ' ';
p = p->next;
}
cout << endl;
}
void swap(node *p0,node *p1,node *p2)
{
//以力扣上的例子为例,n==4,1,2,3,4
p1->next = p2->next;//1-3-4
p0->next = p2;//head-2
p2->next = p1;//2-1-3-4
//类似于数字交换时的 a=b b=t t=a,三条式子就可以解决
}
};
int main()
{
int n;//链表的长度
cin >> n;
linklist a;
a.creat(n);//创建链表
//a.print();验证链表是否创建成功,成功后进行交换的操作
//在此处需要考虑链表长度是奇数还是偶数,举个例子,如果n==4,那么两两分组即可,但是如果n==5,那么第五个数就不需要做出任何操作,由此可得:
//是否需要交换,使用while语句,循环的条件是节点以及节点的next都有意义(也就是都不为空),可以联想到比较特殊的情况(n==1),此时不需要交换,直接输出链表即可
//首先找到要交换的第一组头结点
if (n == 1)//n==1时,下文中出现的p2没有意义
{
a.print();
return 0;//直接结束程序
}
node* p1 = a.head->next;
node* p2 = p1->next;
node* p0 = a.head;
n /= 2;
while (n--)//一共交换n次即可
{
//开始交换
a.swap(p0,p1, p2);
//更新p0,p1,p2
p0 = p2->next;
p1 = p1->next;
if (!p1)//节点以及节点的next都有意义(也就是都不为空)
{
break;
}
p2 = p1->next;
}
a.print();
}
力扣24题详解——两两交换链表中的节点
最新推荐文章于 2024-09-30 14:51:11 发布