Reversing Linked List

本文介绍了一种改进的链表处理方法,通过牺牲空间换取时间效率,将时间复杂度从O(n^2)降低到O(n)。该方法首先读取链表节点并进行逆序操作,然后调整节点地址,最后输出逆序后的链表结构。
//开始时,最大输入时,运行超时
//牺牲空间换时间,时间复杂度由O(n^2)变为O(n);
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct data
{
	int addr;
	int key;
	int next;
} Data, *pData;

typedef struct st
{
	int addr;
	int total;
	int count;
} Start,*pStart;

void PrintResult(Data arr[],int count)
{
	int i;
	for (i = 0; i < count - 1; i++)
	{
		printf("%05d %d %05d\n",arr[i].addr,arr[i].key,arr[i].next);
	}
	printf("%05d %d %d",arr[i].addr,arr[i].key,arr[i].next);

	return ;
}

void ScanfStart(pStart a)
{
	scanf("%d%d%d",&a->addr,&a->total,&a->count);

	return ;
}

void ReverData(pData arr, int n)
{
	int i;
	Data temp;

	for (i = 0; i < n / 2; i++)
	{
		temp.addr = arr[i].addr;
		temp.key = arr[i].key;
		temp.next = arr[i].next;

		arr[i].addr = arr[n-i-1].addr;
		arr[i].key = arr[n-i-1].key;
		arr[i].next = arr[n-i-1].next;

		arr[n-i-1].addr = temp.addr;
		arr[n-i-1].key = temp.key;
		arr[n-i-1].next = temp.next;
	}
}

void CorrectAddress(pData arr, int n)
{
	int i;
	pData temp = (pData)malloc(n*sizeof(Data));
	memcpy(temp, arr, n * sizeof(Data));

	for (i = 0; i < n - 1; i++)
	{
		arr[i].next = temp[i+1].addr;
	}
	arr[n-1].next = -1;
	free(temp);
}

//开始时用的双重循环,运行超时了。
void SortData(pStart start, pData arr, pData num)
{
	int i,j;
	int dest;
	int count = 0;
	dest = start->addr;

	while (dest != -1)
	{
		arr[count].addr = num[dest].addr;
		arr[count].key = num[dest].key;
		arr[count].next = num[dest].next;
		dest = arr[count].next;
		count++;
	}
	start->total = count;
}
int main()
{
	Start s;
	int count,addr,key,next;
	int revercount;
	pData temp;

	ScanfStart(&s);
	pData num = (pData)malloc(100001 * sizeof(Data));

	count = s.total;
	while (count)
	{
		scanf("%d%d%d",&addr,&key,&next);
		num[addr].addr = addr;
		num[addr].key = key;
		num[addr].next = next;
		count--;
	}

	pData arr = (pData)malloc(s.total * sizeof(Data));
	SortData(&s,arr,num);
	free(num);
	revercount = s.total / s.count;

	if (s.count > 1)
	{
		for (count = 0; count < revercount; count++)
		{
			temp = arr + s.count * count;
			ReverData(temp,s.count);
		}
		CorrectAddress(arr,s.total);
	}
	PrintResult(arr,s.total);
	free(arr);

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值