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;
        }
    }
     
    勤能补拙,熟能生巧
  • 相关阅读:
    GCD的常用代码块
    多用字面量语法,少用与之等价的方法
    新建项目上下出现黑色块
    按钮UIButton的使用
    集成支付宝
    app生命周期之即将关闭
    苹果开发者计划申请材料准备(公司级)
    真机调试的一些问题记录~更新中
    iOS开发架构学习记录
    用枚举值表示状态、选项、状态码
  • 原文地址:https://www.cnblogs.com/snzhong/p/12487979.html
Copyright © 2011-2022 走看看