浙江大学数据结构:02-线性结构3 Reversing Linked List (25分)

02-线性结构3 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 (≤) which is the total number of nodes, and a positive K (≤) 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

提测代码:

#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100000
#define Null -1
typedef int Position;
typedef struct Node List;

struct Node{
    int Data;
    Position Next;
};

List vector[MAXSIZE];

int IsNeedReversed(int K, Position startPos){
    while(K && startPos != Null){
        startPos = vector[startPos].Next;
        K--;
    }
    if(K==0){
        return 1;
    }
    return 0;
}

void ReverseList( int K, Position *startPos, Position *parentPos){
    Position nextPos;
    Position prePos = *startPos;
    Position curPos = vector[*startPos].Next;
    K--;
    for(int i = 0; i < K; ++i){
        nextPos = vector[curPos].Next;
        vector[curPos].Next = prePos;
        prePos = curPos;
        curPos = nextPos;
    }
    if(*parentPos != Null){
        vector[*parentPos].Next = prePos;
    }
    vector[*startPos].Next = curPos;
    //修改起始位置
    *parentPos = *startPos;
    *startPos = prePos;
}

int main(){
    int firstPos, N, K;
    scanf("%d %d %d", &firstPos, &N, &K);
    int pos, data, next;
    for(int i = 0; i < N; ++i){
        scanf("%d", &pos);
        scanf("%d %d", &vector[pos].Data, &vector[pos].Next);
    }
    //第一次逆转需要保存头指针
    Position parentPos = Null;
    if( K!=1 && IsNeedReversed(K, firstPos)){
        ReverseList(K, &firstPos, &parentPos);
        Position startPos = vector[parentPos].Next;
        while(IsNeedReversed(K, startPos)){
            ReverseList(K, &startPos, &parentPos);
            startPos = vector[parentPos].Next;
        }
    }
    //重置开始位置为起始位置
    pos = firstPos;
    if(pos != Null){
        while(vector[pos].Next != Null ){
            printf("%05d %d %05d
", pos, vector[pos].Data, vector[pos].Next);
            pos = vector[pos].Next;
        }
        printf("%05d %d %d
", pos, vector[pos].Data, vector[pos].Next);
    }
    return 0;
}

提测结果:

原文地址:https://www.cnblogs.com/2018shawn/p/13829050.html