1074 Reversing Linked List (25 分)(链表)
Description
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
生词
英文 | 解释 |
---|---|
singly linked list | 单链表 |
sublist | 子表 |
分析:
把地址为temp的数的数值存入data[temp]中,把temp的下一个结点的地址存入next[temp]中。
这道题在乙级中做过了,现在再回顾一遍~
注意:
不一定所有的输入的结点都是有用的,加个计数器sum
如果不足k个反转的话,保持原序。
原文链接
题解
这里只用了一个list数组来存储链表的地址,原先的顺序为:
00100->12309->33218->0000->9999->68237
反转后为:
00000->33218->12309->00100->9999->68237
第一次做不理解的地方,现在有了新的思考:
for(int i=0;i<(sum-sum%k);i+=k){
reverse(begin(list)+i,begin(list)+i+k);
}
应该是相当于sum减去一个不足k的小尾巴,这样剩下的就都是k的整数倍了~
#include <bits/stdc++.h>
using namespace std;
int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
int n,k,num,first;
scanf("%d %d %d",&first,&n,&k);
int data[100005],next[100005],list[100005];
for(int i=0;i<n;i++){
cin>>num;
cin>>data[num]>>next[num];
}
int sum=0;
while(first!=-1){
list[sum++]=first;
first=next[first];
}
//for(int i=0;i<sum-1;i++)
//cout<<list[i]<<endl;
for(int i=0;i<(sum-sum%k);i+=k){
reverse(begin(list)+i,begin(list)+i+k);
}
for(int i=0;i<sum-1;i++){
printf("%05d %d %05d\n",list[i],data[list[i]],list[i+1]);
}
printf("%05d %d -1\n",list[sum-1],data[list[sum-1]]);
return 0;
}
反思
没想到才过了没多久,我就完全想不起来做法了呜呜呜呜呜呜
以后还要多多回顾吖!
本文来自博客园,作者:勇往直前的力量,转载请注明原文链接:https://www.cnblogs.com/moonlight1999/p/15497910.html