PAT甲级 1074 Reversing Linked List (25 分)数组链表

1074 Reversing Linked List (25 分)

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 Lbeing 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 (≤10​5​​) 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

题目大意: 有一个链表,按照K的取值将链表部分倒序并且重新组成新的链表,再将该链表重新输出。用数组来存储链表,并配合vector来存储结点很方便解决。

注意K的取值使剩余结点不足与满足时,链接会不同。

#include <iostream>
#include <cstdio> 
#include <vector>
using namespace std;

struct node{
    int add,data,next;
};

int main()
{
    node arr[100000];
    int head,n,k;
    cin>>head>>n>>k;

    int add,data,next;
    for(int i=0;i<n;i++){
       cin>>add>>data>>next;
       arr[add] = node{add,data,next};
    }
    
    vector<node> vec;
    vector<vector<node>> temp;
    for(int i=head;i != -1;i = arr[i].next){
        vec.push_back(arr[i]);
        if(vec.size() == k)
        {
            temp.push_back(vec);
            vec.clear();
        }
    }
    
    int flag = 0;
    if(vec.size() < k){
    	temp.push_back(vec);
    	flag = 1;
    }

	vector<node> res;
	if(flag == 0){
		for(int i=0;i<temp.size();i++){
			vector<node> vec = temp[i];
			for(int j=vec.size()-1;j>=0;j--)
				res.push_back(vec[j]);
		}
	}else{
		for(int i=0;i<temp.size()-1;i++){
			vector<node> vec = temp[i];
			for(int j=vec.size()-1;j>=0;j--)
				res.push_back(vec[j]);
		}
		
		vector<node> vec = temp[temp.size()-1];
		for(int j=0;j<vec.size();j++)
			res.push_back(vec[j]);
	}
	
	for(int i=0;i<res.size();i++){
		printf("%05d %d",res[i].add,res[i].data);
		if(i == res.size()-1)
			printf(" -1");
		else
			printf(" %05d\n",res[i+1].add);
	}
		
   
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_29762941/article/details/82952975