1-10 单链表分段逆转

1-10 单链表分段逆转

  • 分数:6
  • 作者:陈越
  • 单位:浙江大学

给定一个带头结点的单链表和一个整数K,要求将链表中的每K个结点做一次逆转。例如,单链表 1→2→3→4→5→6 与 K=3 结合,结果为 3→2→1→6→5→4;若 K=4,则结果为 4→3→2→1→5→6(剩余不足K个的结点保持原顺序)。

函数接口定义

void K_Reverse( List L, int K );

其中List结构定义如下:

typedef struct Node *PtrToNode;
struct Node {
    ElementType Data; /* 存储结点数据 */
    PtrToNode   Next; /* 指向下一个结点的指针 */
};
typedef PtrToNode List; /* 定义单链表类型 */
  • L:给定的带头结点单链表;
  • K:每段逆转的结点长度(K≥1);
  • 函数功能:按要求分段逆转链表,直接修改原链表(无返回值)。

裁判测试程序样例

#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

限制条件

  • 代码长度限制:16 KB
  • 时间限制:400 ms
  • 内存限制:64 MB
  • 栈限制:8192 KB

解析

static int getLength( List L ){
    int len = 0;
    L = L->Next;
    while(L){
        len++;
        L = L->Next;
    }
    return len;
}
void K_Reverse( List L, int K ){
    int flag = 0;    // 当前改造起始位置
    int len = getLength(L);
    PtrToNode cur = L->Next;    // 遍历指针
    PtrToNode later = NULL;
    PtrToNode head = L;    // 定义一个虚拟头结点
    while(flag + K <= len){
        PtrToNode tail = cur;    // 提前存第一段反转后的尾指针
        // k区间反转操作
        for(int i = 0; i < K; i++){
            later = cur->Next;
            cur->Next = head->Next;
            head->Next = cur;
            cur = later;
        }
        // 更新虚拟头结点
        head = tail;
        head->Next = cur;
        flag += K;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值