02-线性结构3 Reversing Linked List(C)

日常,22分共25分

2.最大N,最后剩K-1不反转 ......................................... 运行超时

总结,我的个人问题,一味的认为链表的线性表高级,便一直用,但是忘了要符合实际,顺序表的查找是O(1), 线性表是O(N),而且我的跟裹脚布一样,太长了<^v^>

Given a constant K and a singly linked list L, you are supposed to reverse the links of every K elements on L. For example, given L being 1→2→3→4→5→6, if K=3, then you must output 3→2→1→6→5→4; if K=4, you must output 4→3→2→1→5→6.

Input Specification:

Each input file contains one test case. For each case, the first line contains the address of the first node, a positive N (≤105) which is the total number of nodes, and a positive K (≤N) which is the length of the sublist to be reversed. The address of a node is a 5-digit nonnegative integer, and NULL is represented by -1.

Then N lines follow, each describes a node in the format:

Address Data Next

where Address is the position of the node, Data is an integer, and Next is the position of the next node.

Output Specification:

For each case, output the resulting ordered linked list. Each node occupies a line, and is printed in the same format as in the input.

Sample Input:

00100 6 4
00000 4 99999
00100 1 12309
68237 6 -1
33218 3 00000
99999 5 68237
12309 2 33218

Sample Output:

00000 4 33218
33218 3 12309
12309 2 00100
00100 1 99999
99999 5 68237
68237 6 -1

 我的AC: 

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>

typedef struct LNode *List;
struct LNode{
	int fadr; //first adress
	int data;
	int nadr;
	List Next;
};

List read_link();
void attach(int f, int d, int n, List* PtrL);
List reverse_link(List PtrL);
void Reverse(List *PtrL, List *rear, int *a);
List search_adress(int adress, List PtrL);
void Print_link(List PtrL);
void Free_link(List PtrL);

int main()
{
	List P1, P;
	P1 = read_link();
	P = reverse_link(P1);
	Print_link(P);
	Free_link(P1);
	Free_link(P);
	return 0;
}
List read_link()
{
	int first, length, key;
	int fadr, data, nadr;
	List P, rear;
	scanf("%d%d%d", &first, &length, &key);
	P = (List)malloc(sizeof(struct LNode));
	P ->Next = NULL;
	P ->fadr = first;
	P ->data = length;
	P ->nadr = key;
	rear = P;
	while(length--){
		scanf("%d%d%d", &fadr, &data, &nadr);
		attach(fadr, data, nadr, &rear);
	}
	return P;
}
void attach(int f, int d, int n, List* PtrL)
{
	List A1;
	A1 = (List)malloc(sizeof(struct LNode));
	A1 ->fadr = f;
	A1 ->data = d;
	A1 ->nadr = n;
	A1 ->Next = NULL;
	(*PtrL) ->Next = A1;
	*PtrL = A1;
}
List reverse_link(List PtrL)
{
	List Link, P;
	List new_link, rear, T;
	int adress = PtrL ->fadr;
	int a[PtrL ->data];
	                                                                                                                                                                                                                                                                                                                                         	
	new_link = (List)malloc(sizeof(struct LNode));
	new_link ->Next = NULL;
	rear = new_link;
	
	Link = PtrL ->Next;
	for(int i = 0; i < PtrL ->data; i++)
	{
		P = search_adress(adress, Link);
		if(!P){
			PtrL ->data = i;
			break;
		}
		a[i] = P ->fadr;
		adress = P ->nadr; 
	}
	Reverse(&PtrL, &rear, a);
	T = new_link;
	new_link = new_link ->Next;
	free(T);
	return new_link;
}
void Reverse(List *PtrL, List *rear, int *a)
{
	List P;
	int flag = 0, Temp;
	int j = (*PtrL)->nadr -1;
	bool sign = false;
	while(flag != (*PtrL)->data - 1){
		if((*PtrL)->nadr != 1 && j % (*PtrL)->nadr == 0){
			P = search_adress(a[j], (*PtrL)->Next);
			Temp = j;
			if((*PtrL) ->data - (flag + 1) >= (*PtrL)->nadr){
				j = flag + ((*PtrL)->nadr);
			}else{
				j = flag + 1;
				sign = true;
			}
			attach(a[Temp], P->data, a[j], rear);
			flag++;
		}
		P = search_adress(a[j], (*PtrL)->Next);
		if(sign || (*PtrL)->nadr == 1){
			attach(a[j], P->data, a[j + 1], rear);
			j ++;
		}else{
			attach(a[j], P->data, a[j-1], rear);
			j --;
		}
		flag++;
	}
	P = search_adress(a[j], (*PtrL)->Next);
	attach(a[j], P->data, -1, rear);
}
List search_adress(int adress, List PtrL)
{
	if(!PtrL){
		return NULL;
	}
	while(PtrL)
	{
		if(PtrL ->fadr == adress)
			return PtrL;
		PtrL = PtrL ->Next;
	}
	return NULL;
}
void Print_link(List PtrL)
{
	if(!PtrL){
		return ;
	}
	while(PtrL->Next){
		printf("%05d %d %05d\n", PtrL->fadr, PtrL ->data, PtrL ->nadr);
		PtrL = PtrL ->Next;
	}
	printf("%05d %d %d\n", PtrL->fadr, PtrL ->data, PtrL ->nadr);
	return ;
}
void Free_link(List PtrL)
{
	List T;
	if(!PtrL){
		return ;
	}
	while(PtrL){
		T = PtrL;
		PtrL = PtrL ->Next;
		free(T);
	}
}

  • 16
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
题目描述 给定一个常数 $K$ 以及一个单链表 $L$,请编写程序将 $L$ 中每 $K$ 个结点反转。例如:给定 $L$ 为 1→2→3→4→5→6,$K$ 为 3,则输出应该为 3→2→1→6→5→4;如果 $K$ 为 4,则输出应该为 4→3→2→1→5→6,即最后不到 $K$ 个元素不反转。 输入格式 每个输入包含一个测试用例。每个测试用例第 1 行给出第 1 个结点的地址、结点总个数正整数 $N (\le 10^5)$、以及正整数 $K (\le N)$,即要求反转的子链结点的个数。结点的地址是 5 位非负整数,NULL 地址用 −1 表示。 接下来有 $N$ 行,每行格式为: Address Data Next 其中 Address 是结点地址;Data 是该结点保存的整数数据;Next 是下一结点的地址。题目保证给出的链表不为空。 输出格式 对每个测试用例,顺序输出反转后的链表,其上每个结点占一行,格式与输入相同。 输入样例 00100 6 4 00000 4 99999 00100 1 12309 68237 6 -1 33218 3 00000 99999 5 68237 23333 2 33218 输出样例 00000 4 33218 33218 3 12309 12309 1 99999 99999 5 68237 68237 6 23333 23333 2 -1 题目分析 本题需要将链表中每 $K$ 个结点反转,可以采用迭代的方法,每次找到 $K$ 个结点,将这 $K$ 个结点反转,然后将这 $K$ 个结点的前驱结点指向反转后的第一个结点,将反转后的 $K$ 个结点的最后一个结点指向下一个要反转的结点,然后继续进行下一轮反转。 需要注意的是,如果链表长度不足 $K$,则不进行反转。 代码实现

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值