02-线性结构3 Reversing Linked List及踩的坑

这篇博客讨论了一种链表操作问题,即如何每隔K个节点翻转链表的部分元素。作者首先描述了在理解题目时遇到的陷阱,然后详细解释并展示了实现该操作的代码。代码中包括了主要的翻转函数`ReverseListK`和整体翻转函数`ReverseList`。博客还包含了完整的输入输出示例,帮助理解算法的运行过程。
摘要由CSDN通过智能技术生成

踩过的坑:
1、可能会出现输入的数据不在链表节点上。
2、看错题目成翻转前K个元素。正确的题意:每隔k个节点翻转一下,输出翻转结果。我把翻转前K个元素的函数进行改编,写成一个独立的函数。一次又一次地输出翻转后的K个元素,直到剩余元素小于K个。我方法应该不好,只能不断地调试,直到AC。
在这里插入图片描述

#include <stdio.h>
#define MaxSize 100003
typedef int ElementType;
typedef int Ptr;
typedef struct node{
	ElementType Data;
	Ptr Next;
}Node; 
int ReverseListK(Node List[],int HeadPtr,int K,int N);
void ReverseList(Node List[],int HeadPtr,int K,int N);
int main()
{
	Node List[MaxSize];
	int HeadPtr,N,K,NowPtr,D,NextPtr;
	scanf("%d%d%d",&HeadPtr,&N,&K);
	for(int i=0;i<N;i++){
		scanf("%d%d%d",&NowPtr,&D,&NextPtr);
		List[NowPtr].Data=D;
		List[NowPtr].Next=NextPtr;
	}
	int tep=HeadPtr,j=0;
	while(tep!=-1){
		j++;
		tep=List[tep].Next;
	}
	ReverseList(List,HeadPtr,K,j);
	return 0;
}
int ReverseListK(Node List[],int HeadPtr,int K,int N)
{
	int PtrList[MaxSize];
	int Ptr=HeadPtr;
	//记录HeadPtr开始,前K个元素的地址 
	for(int i=0;i<K;i++){
		PtrList[i]=Ptr;
		Ptr=List[Ptr].Next;
	}
	
	int Ptr2K=HeadPtr;
	if(N>=2*K){
		// 要在逆转前进行找第2*K个元素的地址 
		for(int i=0;i<2*K-1;i++)
			Ptr2K=List[Ptr2K].Next;
	}
	int RevHeadPtr=PtrList[K-1],tep;
	//逆转前K个元素 
	for(int i=K-1;i>0;i--){
		List[PtrList[i]].Next=PtrList[i-1];
	}
	List[HeadPtr].Next=Ptr;
	//打印逆转后的K-1个元素 
	tep=RevHeadPtr; 
	for(int i=0;i<K-1;i++){
		printf("%05d %d %05d\n",tep,List[tep].Data,List[tep].Next);
		tep=List[tep].Next;
	}
	
	if(List[tep].Next==-1)
		printf("%05d %d %d",tep,List[tep].Data,-1);
	else{
		if(N>=2*K)
			printf("%05d %d %05d\n",tep,List[tep].Data,Ptr2K);	
		else
			printf("%05d %d %05d\n",tep,List[tep].Data,List[tep].Next);
		
	} 	
	return List[HeadPtr].Next; 
}
void ReverseList(Node List[],int HeadPtr,int K,int N)
{
	int PtrList[MaxSize];
	int times=N/K,rest=N%K;
	int tepPtr=HeadPtr;
	if(N%K==0){
		for(int i=0;i<times;i++){
			tepPtr=ReverseListK(List,tepPtr,K,N-i*K);
		}
		return;
	}
	else{
		for(int i=0;i<times;i++){
		tepPtr=ReverseListK(List,tepPtr,K,N-i*K);
		}	
		for(int i=0;i<rest-1;i++){
			printf("%05d %d %05d\n",tepPtr,List[tepPtr].Data,List[tepPtr].Next);
			tepPtr=List[tepPtr].Next;			
		}
		printf("%05d %d %d",tepPtr,List[tepPtr].Data,-1);
	}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值