1025 反转链表

本文介绍了一种链表操作算法,通过C++实现链表的分组反转。首先,利用vector容器存储链表节点,然后按指定长度k对链表进行分组,并对每个分组内的节点进行反转。最后,将反转后的节点重新连接成新的链表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<iostream>
#include<cstdio>
#include<vector>
#include<string>
using namespace std;
struct node
{
	int add;//当前地址 
	int data;//数据 
	int next;//下一个的地址 
};
int main ()
{
	int a,n,k;
	cin>>a>>n>>k;
	vector <node> s(100000);//建立一个存放node类型数据的容器 组 
	vector <node> ss;// 建立一个存放node类型数据的容器 ,存放原本的链表 
	vector <node> re;//建立一个存放node类型数据的容器 ,存放反转后的链表 
	node tmp;//临时node类型变量 
	for(int i=0;i<n;i++)
	{
		scanf("%d %d %d",&tmp.add,&tmp.data,&tmp.next );
		s[tmp.add]=tmp;
	}
	int nextadd=a;//起始地址 
	if(nextadd==-1)
	{
		printf("-1\n");
	}
	else
	{
		while(nextadd!=-1)
	{
		ss.push_back(s[nextadd]);//向原数组尾部插入一个node,其中,当前地址就是数组s的下标 
		nextadd=s[nextadd].next ;
	}
	int l=ss.size();
	int temp=k-1;
	while(temp<l)
	{
		for(int i=temp;i>temp-k;i--)//每k个反转一次 
		{
			re.push_back(ss[i]);//从后向前将原来的node插入反转后的re容器中 
		}
		temp=temp+k;
	}
	for(int i=temp-k+1;i<l;i++)//将剩余的插入re 
		re.push_back(ss[i]);
	for(int i=0;i<l-1;i++)//将re进行链接 
	{
		re[i].next=re[i+1].add;
		printf("%05d %d %05d\n",re[i].add,re[i].data,re[i].next);
	}
	printf("%05d %d -1\n",re[l-1].add,re[l-1].data);//最后一个输出-1 
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值