PTA 数据结构 基础实验3-2.2 单链表分段逆转

    科技2022-07-10  138

    基础实验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;

    List item

    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

    主要参照博客园大佬:DirWangK

    void K_Reverse( List L, int K ) { PtrToNode end1,end2,r,p,H; /*用end1记录头,end2记录尾,每次插入都是头插入, 每过一个K更新end1,end2,H用来计算链表的长度*/ int count = 0; int i,j; end1 = L; end2 = L->Next; r = L->Next; p = r->Next; /*最妙的地方*/ /*用r来标记当前插入的元素,但是由于插入后r->Next就断了, 用p来衔接下一个*/ H = L->Next; if(K>=1) { while(H) { H = H->Next; count++; } if(count>=K) { for(i=0;i<count/K;i++) { for(j=0;j<K;j++) { r->Next = end1->Next; end1->Next = r; r = p; /*这里为什么要判断? 因为如果count和K刚好有整数倍关系 那p最后会指向NULL,再往后指程序就会卡在这里*/ if(p) p = p->Next; } end1 = end2; end2 = r; } end1->Next = r; } } }
    Processed: 0.038, SQL: 8