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

    函数接口定义:

    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

    解题思路:先计算单链表长度,确定逆转次数
    然后边遍历边翻转
    void K_Reverse( List L, int K ) {
        int cnt;
        int len=0,i;
        List p=L,r,s,t,q=p->Next,tmp;
        while(q) {
            q=q->Next;
            len++;
        }
        if(!len||K>len||K<=1)return;
        for(i=0; i<len/K; i++) {
            cnt=0;
            r=p->Next;
            s=r->Next;
            t=r;
            while(cnt!=K-1) {//注意是K-1次
                tmp=s->Next;
                s->Next=r;
                r=s;
                s=tmp;
                cnt++;
            }
            t->Next=s;
            p->Next=r;
            p=t;
        }
    }
     
    勤能补拙,熟能生巧
  • 相关阅读:
    返回一个整数数组中最大子数组的和
    软件工程概论第五周学习进度
    软件工程概论第四周学习进度
    软件工程个人作业03
    软件工程概论第三周学习进度
    软件工程个人作业02
    软件工程概论学习进度第二周
    寻找水王
    第七周学习进度
    二维数组最大值
  • 原文地址:https://www.cnblogs.com/snzhong/p/12487979.html
Copyright © 2011-2022 走看看