力扣24题详解——两两交换链表中的节点

#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();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值