zoukankan      html  css  js  c++  java
  • 基础实验3-2.2 单链表分段逆转 (25分)

    给定一个带头结点的单链表和一个整数K,要求你将链表中的每K个结点做一次逆转。例如给定单链表 1→2→3→4→5→6 和 K=3,你需要将链表改造成 3→2→1→6→5→4;如果 K=4,则应该得到 4→3→2→1→5→6。

    函数接口定义:

    void K_Reverse( List L, int K );
    
     

    其中List结构定义如下:

    typedef struct Node *PtrToNode;
    struct Node {
        ElementType Data; /* 存储结点数据 */
        PtrToNode   Next; /* 指向下一个结点的指针 */
    };
    typedef PtrToNode List; /* 定义单链表类型 */
    
     

    L是给定的带头结点的单链表,K是每段的长度。函数K_Reverse应将L中的结点按要求分段逆转。

    裁判测试程序样例:

    #include <stdio.h>
    #include <stdlib.h>
    
    typedef int ElementType;
    
    typedef struct Node *PtrToNode;
    struct Node {
        ElementType Data; /* 存储结点数据 */
        PtrToNode   Next; /* 指向下一个结点的指针 */
    };
    typedef PtrToNode List; /* 定义单链表类型 */
    
    List ReadInput(); /* 裁判实现,细节不表 */
    void PrintList( List L ); /* 裁判实现,细节不表 */
    void K_Reverse( List L, int K );
    
    int main()
    {
        List L;
        int K;
    
        L = ReadInput();
        scanf("%d", &K);
        K_Reverse( L, K );
        PrintList( L );
    
        return 0;
    }
    
    /* 你的代码将被嵌在这里 */
    
     

    输入样例:

    6
    1 2 3 4 5 6
    4
    
     

    输出样例:

    4 3 2 1 5 6

    代码:
    #include <stdio.h>
    #include <stdlib.h>
    
    typedef int ElementType;
    
    typedef struct Node *PtrToNode;
    struct Node {
        ElementType Data; /* 存储结点数据 */
        PtrToNode   Next; /* 指向下一个结点的指针 */
    };
    typedef PtrToNode List; /* 定义单链表类型 */
    
    List ReadInput() {
        int n,d;
        List L = (PtrToNode)malloc(sizeof(struct Node)),p = L;
        p -> Next = NULL;
        scanf("%d",&n);
        for(int i = 0;i < n;i ++) {
            scanf("%d",&d);
            PtrToNode q = (PtrToNode)malloc(sizeof(struct Node));
            q -> Data = d;
            q -> Next = NULL;
            p -> Next = q;
            p = q;
        }
        return L;
    }
    void PrintList( List L ) {
        while(L -> Next) {
            printf("%d ",L -> Next -> Data);
            L = L -> Next;
        }
    }
    void K_Reverse( List L, int K );
    
    int main()
    {
        List L;
        int K;
    
        L = ReadInput();
        scanf("%d", &K);
        K_Reverse( L, K );
        PrintList( L );
    
        return 0;
    }
    
    void K_Reverse( List L, int K ) {
        List t = L -> Next,d = t,p = L,a,b,r = t;
        int num = 0;
        while(1) {
            while(d && num < K) {
                d = d -> Next;
                num ++;
            }
            if(num < K) break;
            a = r -> Next;
            num = 1;
            while(num < K) {
                num ++;
                b = a -> Next;
                a -> Next = t;
                t = a;
                a = b;
            }
            p -> Next = t;
            p = r;
            r = t = d;
            num = 0;
        }
        p -> Next = r;
    }
  • 相关阅读:
    鼠标拖放div 实现
    layerX offsetX pageX
    960 grid 使用
    960 grid 分析
    WebMatrix安装和使用
    Sass使用教程
    CSS预处理器实践之Sass、Less比较
    node.js 入门教程(beginnder guide
    node.js NPM 使用
    《Head First 设计模式》学习笔记——状态模式
  • 原文地址:https://www.cnblogs.com/8023spz/p/12302690.html
Copyright © 2011-2022 走看看