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;
}

反思

没想到才过了没多久,我就完全想不起来做法了呜呜呜呜呜呜
以后还要多多回顾吖!

posted @ 2021-11-02 11:08  勇往直前的力量  阅读(26)  评论(0编辑  收藏  举报