zoukankan      html  css  js  c++  java
  • 浙江大学数据结构: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;
    }

    提测结果:

  • 相关阅读:
    【原创】C++11:左值和右值(深度分析)
    【基础核心理论】运算符重载
    左值与右值引用 详解
    托盘图标编程
    C/C++ 数组与指针
    webpack 4.0改版问题
    mysql5.7安装记录
    equals方法
    【原创】IO流:读写操作研究(输入流)
    为什么重写equals一定要重写hashCode?
  • 原文地址:https://www.cnblogs.com/2018shawn/p/13829050.html
Copyright © 2011-2022 走看看