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 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 (<= 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


题目大意:给出n个节点,以及头结点,要求把相邻的k个节点翻转, 如果n不能被k整除,剩下的节点按照原来的顺序
思路:先用vector<int> value保存当前节点的值, vector<int> v保存当前节点指向下一个节点的指针; 然后再根据链表信息把k个链表的信息保存在vector<node> temp中, 然后在反向添加到vector<node> link中;
修改link中链表信息,输出结果
注意点:在使用vector的时候,如果事先申明了vector的大小,如果再使用push_back()在压在申请内存的后面的,而不是从头开始压入的;
    此外,pat的链表类题中,经常存在不在链表中的节点, 所以在最后的循环输出的时候,不能以节点个数作为循环结束的判断,应该以link的大小作为循环次数的判断
 1 #include<iostream>
 2 #include<vector>
 3 using namespace std;
 4 struct node{
 5   int addr, val, next;
 6 };
 7 
 8 int main(){
 9   int root, n, k, i, j;
10   cin>>root>>n>>k;
11  vector<int> value(100000), v(100000);
12  int addr, val, next;
13   for(i=0; i<n; i++){
14     scanf("%d %d %d", &addr, &val, &next);
15     value[addr] = val;
16     v[addr] = next;
17   }
18   vector<node> link;
19   for(i=0; i<n/k+1; i++){
20       node nnode;
21       vector<node> temp;
22       for(j=0; j<k; j++){
23         if(root==-1) break;
24         nnode.addr=root;
25         nnode.val=value[root];
26         nnode.next=v[root];
27         root=v[root];
28         temp.push_back(nnode);
29       }
30       if(temp.size()==k) for(j=k-1; j>=0; j--) link.push_back(temp[j]);
31       else for(j=0; j<temp.size(); j++) link.push_back(temp[j]);
32   }
33 
34   for(i=0; i<link.size(); i++){
35       if(i!=link.size()-1){
36         link[i].next=link[i+1].addr;
37         printf("%05d %d %05d\n", link[i].addr, link[i].val, link[i].next);
38       }else printf("%05d %d %d", link[link.size()-1].addr, link[link.size()-1].val, -1);
39   }
40   
41   return 0;
42 }

猜你喜欢

转载自www.cnblogs.com/mr-stn/p/9166471.html