6-9 单链表分段逆转 (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;
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

 1 void K_Reverse( List L, int K ){
2 PtrToNode r, p, end1,end2 ,H = L->Next;//_ 1 2 3 4 5 6 7 8 9 10 11 12
3 /**end1和end2是用来连接两个逆置后的分段;
4 一开始我们令end1指向头节点,end2指向数据1所在的节点,为什么这样做呢?
5 因为前四个数据我们都要把他以头插入方式插到L后面,也就是end1后面;
6 当我们遍历到节点5的时候我们需要令end1 = end2;end2 = 5所在的节点;
7 然后我们需要将5 6 7 8再以头插入的方式插入到1节点的后面,也就是end1的后面
8 也就是说我们一直将节点以头插入的方式插入到end1后面,而end2使用来记录下一个
9 分段的第一个节点,也就是下一个end1,就这样不断更新end1就可以实现将整个链表
10 分段逆置;这是end1和end2的作用
11 */
12 end1 = L;
13 end2 = L->Next;
14 r = L->Next; //用来遍历链表
15 p = r->Next;
16 int count = 0;
17 /**
18 count用来记录链表节点总数;
19 为什么要记录总数?
20 因为我们要知道链表最后一个分段是不足K个节点,还是刚好K个节点;
21 如果不足就不用逆置,如果刚好也要把这一分段逆置了;
22 */
23 if (K>=1) //这里就是我上面说的考虑K的情况
24 {
25 //记录总数
26 while (H)
27 {
28 count++;
29 H = H->Next;
30 }
31
32 //判断,如果总数小于K就不变链表
33 if (count>=K)
34 {
35 /**count/K是我们总共需要循环几个分段,因为count/K结果去商,
36 所以如果count不能被K整除,即最后一个分段不足K个,我们就不循环
37 也就是不动它。
38 */
39 for (int j = 0;j<count/K;j++)
40 {
41 //每个分段循环K次
42 for(int i = 0; i < K; i++)
43 {
44 r->Next = end1->Next; //头插入
45 end1->Next = r;
46 r = p;
47 /**
48 这里为什么要判断p不为空呢?
49 因为我一开令r = L->Next;
50 p = r->Next;
51 所以最后p会指向链表最后的Next域,而Next为空,就不
52 存在p的Next域,如果不判断的话程序运行到此处就不会再运行下去
53 而程序一开始编译的时候不会报错,所以这一点很重要,即判断越界
54 问题,我也是找了很长时间才找点这一点。
55 */
56 if(p)
57 p = p->Next;
58 }
59 end1 = end2; //更新end1和end2
60 end2 = r;
61 }
62 end1->Next = r; //最后将尾节点Next域置空。
63 }
64 }
65
66 }

PTA 单链表分段逆转的更多相关文章

  1. 数据结构1_C---单链表的逆转

    通过C语言函数实现单链表的逆转操作 例: 输入数据1,2,3,4 输出数据4,3,2,1 一共三个文件: 头文件stulist,h :链表结点的定义,结点指针的定义 源文件stulist.c:具体的实 ...

  2. PTA 6-1 单链表逆转

    本题是一个非常经典的题目:单链表逆转. 这是链表结点的定义: typedef struct Node *PtrToNode; struct Node { ElementType Data; /* 存储 ...

  3. LeetCode 笔记系列六 Reverse Nodes in k-Group [学习如何逆转一个单链表]

    题目:Given a linked list, reverse the nodes of a linked list k at a time and return its modified list. ...

  4. Python3玩转单链表——逆转单向链表pythonic版

    [本文出自天外归云的博客园] 链表是由节点构成的,一个指针代表一个方向,如果一个构成链表的节点都只包含一个指针,那么这个链表就是单向链表. 单向链表中的节点不光有代表方向的指针变量,也有值变量.所以我 ...

  5. 6. Reverse Linked List 逆转单链表

    逆转单链表,比较简单,不细讲,扫描依次改变指针指向. class Solution { public: ListNode* reverseList(ListNode* head) { if(head= ...

  6. PTA 循环单链表区间删除 (15 分)

    本题要求实现带头结点的循环单链表的创建和单链表的区间删除.L是一个带头结点的循环单链表,函数ListCreate_CL用于创建一个循环单链表,函数ListDelete_CL用于删除取值大于min小于m ...

  7. 数据结构 单链表元素定位 PTA

    由于这个很简单,他也貌似没要判断溢出,取巧突破 #include<stdio.h> #include<malloc.h> #include<stdlib.h> // ...

  8. PTA之求单链表结点的阶乘和

    本题要求实现一个函数,求单链表L结点的阶乘和.这里默认所有结点的值非负,且题目保证结果在int范围内. 时间限制: 400ms 内存限制: 64MB 代码长度限制: 16KB 函数接口定义: int ...

  9. pta 奇数值结点链表&&单链表结点删除

    本题要求实现两个函数,分别将读入的数据存储为单链表.将链表中奇数值的结点重新组成一个新的链表.链表结点定义如下: struct ListNode { int data; ListNode *next; ...

随机推荐

  1. Chrome blocked third-party cookies

    Chrome blocked third-party cookies Chrome Incognito Chrome 无痕模式 https://support.google.com/chrome/an ...

  2. Dart Web

    Dart Web Dart for Web https://dart.dev/platforms dart2js xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允 ...

  3. Union international INC:VR线下娱乐市场巨大

    联合国际公司认为众多企业追着VR的风口不断加码,导致VR在经历了一个爆炸式的发展,如今部分VR公司开始觉得日子不好过了,一个重要表现就是现金流紧张.VR如何能够普及,何时能够及早变现,成为业内关注的焦 ...

  4. Docker中配置MySQL并实现远程访问

    Docker配置MySQL容器 拉取MySQL镜像 docker pull mysql:5.6 有可能会因为网络问题失败,重复尝试. 创建容器 docker run -d --name selfdef ...

  5. PythonPEP8 风格规范指南

    PEP是Python Enhancement Proposal的缩写,通常翻译为"Python增强提案".每个PEP都是一份为Python社区提供的指导Python往更好的方向发展 ...

  6. 对Map进行复合操作(读写)且并发执行时,无法保证业务的行为是正确的,对读写操作进行同步则可以解决。

    ConcurrentHashMap通常只被看做并发效率更高的Map,用来替换其他线程安全的Map容器,比如 Hashtable和Collections.synchronizedMap.线程安全的容器, ...

  7. 如何用Eggjs从零开始开发一个项目(1)

    前言 "纸上得来终觉浅,绝知此事要躬行."虽然node一直在断断续续地学,但总是东一榔头西一榔头的,没有一点系统,所以打算写一个项目来串联一下之前的学习成果. 为什么选择Eggjs ...

  8. vue3中的通过proxy实现双向数据绑定的原理

    1.什么是Proxy?它的作用是? 据阮一峰文章介绍:Proxy可以理解成,在目标对象之前架设一层 "拦截",当外界对该对象访问的时候,都必须经过这层拦截,而Proxy就充当了这种 ...

  9. 如何在 C# 中使用 const,readonly,static

    平时在开发时经常会用到 const,readonly,static 关键字,可以肯定这些关键词是完全不同的概念,但有时候他们在用法上很相似以至于在场景中不知道选择哪一个,这篇文章我们就来讨论 C# 中 ...

  10. sql之对top语句理解

    起因 事情的起因是在群里和大佬讨论问题,讨论select top x后加*的问题,这时突发奇想,想搞清楚这个看起来在sql中略显突兀的语句结构,就有了这篇文 先看例子 select * from 表 ...