迷之1025 反转链表

错误的代码:

#include <cstdio> 
#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <string>
using namespace std;

struct Node
{
	int Nodenow;
	int Nodenext;
	int data;
	Node *next;
};

struct store
{
	int now;
	int next;
	int data;
}a[100005],b[100005];

int turn[100005];

void Node_Print(Node *head)
{
	Node *p = head;
	
	while(p != NULL)
	{
		if(p -> Nodenext != -1)
		printf("%05d %d %05d",p->Nodenow,p -> data,p -> Nodenext);
		else
		{
			printf("%05d %d %d",p->Nodenow,p -> data,p -> Nodenext);
		}
		p = p -> next;
		
		if(p != NULL)printf("
");
	}
}

Node * ReversePart_Node(Node *head,int start,int end)
{
	if(start == end)return head;
	
	Node *pPrv = NULL;
	Node *pNow = head;
	Node *pNext = NULL;
	
	Node *BeforeStart = NULL; //开始的结点前的结点 
	Node *StartNode = NULL; //开始的时候的结点
	int i,j;
	//for循环指向需要反转的位置 
	for(i = 1; i <= start; i++)
	{
		if(i == start)
		{
			BeforeStart = pPrv;
			StartNode = pNow;
		}
		
		pPrv = pNow;
		pNow = pNow -> next;
		pNext = pNow -> next;
	}
	
	for(i = 1; i <= end - start; i++)  
	{
		pNext = pNow -> next; //保存下一个 
		pNow -> next = pPrv; //改变指向 
		pPrv = pNow; //移动 pPrv和 pNow 
		pNow = pNext;
	}
	
	//反转部分 未反转前的第一个结点 反转之后变成该反转部分的最后一个结点 
	StartNode -> next = pNow; //连接 
	
	if(BeforeStart == NULL) //从head开始反转 
	{
		head = pPrv; //pNow 反转过后是 该反转部分的第一个结点 
	}
	else 
	{
		BeforeStart -> next = pPrv; //连接反转部分前面的结点 和 该反转部分 
	}
	
	return head;
}

int inturn(int ibegin,int stot)
{
	int i,j,found;
	int tot = 0;
	int cnt = 1;
	
	if(!turn[ibegin]) return 0;
	
	b[cnt++] = a[turn[ibegin]];
	found = a[turn[ibegin]].next;
	
	while(found != -1)
	{
		b[cnt++] = a[turn[found]];
		found = a[turn[found]].next;
	}
	cnt--;
	
	return cnt;
}

Node *Node_Creat(int tot)
{
	Node *head;
	head = (Node *)malloc(sizeof(Node));
	if(head == NULL)
	{
		printf("Overflow
");
		exit(1);
	}
	
	head -> data = b[1].data;
	head -> Nodenow = b[1].now;
	head -> Nodenext = b[1].next;
	
	Node *p1,*p2;
	p1 = p2 = head;
	for(int i = 2; i <= tot; i++)
	{
		p1 = (Node *)malloc(sizeof(Node));
		if(p1 == NULL)
		{
			printf("Overflow
");
			exit(1);
		}
		
		p1 -> data = b[i].data;
		p1 -> Nodenow = b[i].now;
		p1 -> Nodenext = b[i].next;
		
		p2 -> next = p1;
		p2 = p1;
	}
	p2 -> next = NULL;
	return head;
}

int main()
{
	int stot,reverse;
	int ibegin;
	int i,j;
	
	cin >> ibegin >> stot >> reverse;
	int tot = 0; //结点数 
	
	memset(turn,0,sizeof(turn));
	
	for(i = 1; i <= stot; i++)
	{
	    cin >> a[i].now >> a[i].data >> a[i].next;
	    turn[a[i].now] = i;
	}
	
	tot = inturn(ibegin,stot);
	
	Node *head;
	head = Node_Creat(tot);
	
	for(i = 1; i <= tot/reverse; i++)
	{
		head = ReversePart_Node(head, (i - 1)*reverse + 1, i*reverse);
	}
	
	head = changedata(head);
	
	Node_Print(head);
	
	return 0;
}
/*
00100 12 13
72222 12 -1
62222 11 72222
52222 10 62222
42222 9 52222
32222 8 42222
22222 7 32222
00000 4 99999
00100 1 12309
68237 6 22222
33218 3 00000
99999 5 68237
12309 2 33218
*/

后来根据一些数据的对比,发现反转后的结点下一个地址要发生改变,于是添加了一个函数改变结点中地址的值。

Node *changedata(Node *head)
{
	Node *p = head;
	
	while(p -> next != NULL)
	{
		p -> Nodenext = p -> next -> Nodenow;
		p = p -> next;
	}
	p -> Nodenext = -1;
	
	return head;
}

改了一下输入方式,但是还是超时(挠头

原文地址:https://www.cnblogs.com/qq952693358/p/5514982.html