1074. Reversing Linked List (25)

1.该题要求求出翻转的链表,与leetcode中的Reverse Linked List 和Reverse Linked List II相似。

2.这次解法并没有采用链表操作,而是把链表转化为数组,对数组进行操作

1074

时间限制
400 ms
内存限制
65536 kB
代码长度限制
16000 B
判题程序
Standard
作者
CHEN, Yue

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<string>
//#include <iomanip>
//#include<stack>
//#include<unordered_set>
//#include <sstream>
//#include "func.h"
//#include <list>
#include<unordered_map>
#include<set>
#include<queue>
#include<map>
#include<vector>
#include <algorithm>
#include<stdio.h>
#include<iostream>
#include<string>
#include<memory.h>
#include<limits.h>
#include<stack>
using namespace std;
/*
00100 6 4
00000 4 99999
00100 1 12309
68237 6 -1
33218 3 00000
99999 5 68237
12309 2 33218

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

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

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

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

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

00100 6 6
00000 4 99999
00100 1 12309
68237 6 -1
33218 3 00000
99999 5 68237
12309 2 33218
*/
struct ListNode{
	int val;
	int add;
	ListNode*next;
	ListNode(int x) :val(x), next(NULL){};
	ListNode() :val(0), next(NULL){};
};
int main(void)
{
	vector<ListNode> list(100001,ListNode(-1));
	int head, recordSum, step;
	cin >> head >> recordSum >> step;
	for (int i = 0; i < recordSum; i++)
	{
		int now, val, next;
		scanf("%d %d %d", &now, &val, &next);
		list[now].val = val;
		list[now].add = now;
		if (next != -1)
		{
			list[now].next = &list[next];
			list[next].add = next;
		}
	}
	vector<int> num(100001, -1);//记录地址,地址是唯一的
	int idx=0;
	ListNode* root = &list[head];
	while (root)
	{
		num[idx++] = root->add;
		root = root->next;
	}

	if (step!=0)//等于0时,会进入死循环
		for (int i = 0; i+step <=idx; i+=step)
		{
			for (int j = 0; j < step / 2; j++)
			{
				swap(num[j+i], num[step + i - 1 - j]);
			}
		}
	for (int i = 0; i < idx; i++)
	{
		if (i != idx - 1)
			printf("%05d %d %05d\n", num[i], list[num[i]].val, num[i + 1]);
		else
			printf("%05d %d -1\n", num[i], list[num[i]].val);
	}




	return 0;
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注