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;
        }
    }
     
    勤能补拙,熟能生巧
  • 相关阅读:
    angular 个人零点学习
    angularjs 五大关键点
    OA项目学习总结
    oa
    时间插件
    angular js模态框
    搜索
    xianduanshu
    o-o
    paibingbuzhen
  • 原文地址:https://www.cnblogs.com/snzhong/p/12487979.html
Copyright © 2011-2022 走看看