02-线性结构3 Reversing Linked List (25分)


题目要图
分析一下 重点是逆转K个节点倒序输出 而不是逆转链表上的节点
可以取巧 方法是逆转输出 也可以用逆转链表上的节点来做
本文采用的方式是取巧

#include <stdio.h>
#include <stdlib.h>

#define Maxsize 100005

int main()
{
   int FirstAdd, N, K;
   int Data[Maxsize], Next[Maxsize],List[Maxsize], Sum[Maxsize];
   scanf("%d %d %d", &FirstAdd, &N, &K);
   int i,sum,j,total,p,node = FirstAdd;
   i = 0;
   for (i = 0; i < N; i++)
   {
      int Address,data,next;
      scanf("%d %d %d", &Address,&data, &next);
      Data[Address] = data;
      Next[Address] = next;
   }
   sum=0;total=0;

   while(node != -1)
   {
      List[total++] = node;
      node = Next[node];
   
   }
     
         int n = total / K;
         for (i = 1; i <= n; i++) //设置K个节点成一个区间 K个区间就是K个循环
         {
            p = (i * K) - 1; //记录着K个节点组成的区间中最后一个节点的位置 因为数组从0计算故-1
            for (int j = 0; j < K; j++)
            {
               Sum[sum] = List[p];
               sum++;p--;
            }
         }
         if (total - n * K)
         {
            int residue = total - (n * K);
            p = total-residue;
            for (i = 0; i < residue; i++)
            {
               Sum[p] = List[p];
               p++;
            }
         }
      
   for (i = 0; i < total-1; i++)
   {
      printf("%05d %d %05d\n",Sum[i],Data[Sum[i]],Sum[i+1]);
   }
   printf("%05d %d -1\n",Sum[i],Data[Sum[i]],Next[Sum[i]]);
   getchar();
   getchar();
   return 0;
}

在这里插入图片描述
我的思路逻辑是从他人博客得到
非常感谢@叫我皮卡丘 博主能够为我解惑 以下是他的博客 其中有非常棒数学思想
https://blog.csdn.net/liyuanyue2017/article/details/83269991#comments_13566549
//Maxsize 为100002

  • 我一共设计四个数组
    1.Data[Maxsize]
    2.Next[Maxsize]
    3.List[total+2]
    4.Sum[total+2]
    3与4 数组大小可以是Maxsize 也可以是链表的节点个数+2 其实+1就可以了 也可以不加
    我防止越界 加一下保守

  • 随后用数组Data[Adrees] = dara Next[Adress] =next 这样子通过地址可以知道data
    可以知道next
    接下来将单链表上所有节点存入数组list 并且计数 因为他给的节点不全是在单链表上
    会有多余的节点
    随后我们按顺序存入数组list 这样子我们有了排序好的节点
    在通过K与total 计算K个区间 在每个区间做个K次逆序 这样子就完成
    输出要注意最后next要输出一个-1 所以要单独列出来!
    重要的是从排序好的list数组 取出来重新逆转排好
    list 和Sum数组中按顺序存放节点的地址 所以通过地址我们可以有序的输出
    这是取巧的方法 如果你看到了这里请你最好不要使用这个方法

    老老实实去走逆转单链表节点的顺序吧!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值