鱼C论坛

 找回密码
 立即注册
查看: 1184|回复: 1

太难了,又是这题!求高手帮帮忙!

[复制链接]
发表于 2023-6-30 00:53:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
太难了,还是这题!

给定一个常数K和一个单链表L,我们需要将L中每K个元素的链路进行反转。例如,如果L为1→2→3→4→5→6,如果K=3,则必须输出3→2→1→6→5→4;如果K=4,则必须输出4→3→2→1→5→6。

输入说明: 每个输入文件包含一个测试用例。对于每个测试用例,第一行包含第一个节点的地址,一个正整数N(≤100000),表示节点的总数,和一个正整数K(≤N),表示要反转的子链表的长度。节点的地址是一个5位非负整数,空指针用-1表示。

然后是N行,每行描述一个节点的格式为:

Address Data Next

其中Address是节点的位置,Data是一个整数,Next是下一个节点的位置。

输出说明: 对于每个测试用例,输出结果排序后的链表。每个节点占一行,并以与输入相同的格式打印。

Sample Input:
00100 6 4
00000 4 99999
00100 1 12309
68237 6 -1
33218 3 00000
99999 5 68237
12309 2 33218

Sample Output:
00000 4 33218
33218 3 12309
12309 2 00100
00100 1 99999
99999 5 68237
68237 6 -1

我更新后的代码:
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. typedef struct List *list;
  4. struct List
  5. {
  6.         int address;
  7.         int data;
  8.         int last;
  9.         list next;
  10. };

  11. list read(int n);
  12. void print(list head);
  13. void px(list head,int first);
  14. list dg(list p,list head,int i,int k);

  15. void print(list head)
  16. {
  17.         if(!(head->next)){printf("NULL\n");return;}
  18.          head = head->next;
  19.         while(head)
  20.         {
  21.                         if(head->last != -1)
  22.                 printf("%05d %d %05d\n",head->address,head->data,head->last);
  23.                 else
  24.                 printf("%05d %d %d\n",head->address,head->data,head->last);

  25.                 head = head->next;
  26.         }
  27. }

  28. list read(int n)
  29. {
  30.         list head,p,temp;
  31.         head = p = (list)malloc(sizeof(struct List));
  32.         head->next = NULL;
  33.         
  34.         while(n--)
  35.         {
  36.                 temp =  (list)malloc(sizeof(struct List));
  37.                 scanf("%d %d %d",&temp->address,&temp->data,&temp->last);
  38.                 p->next = temp;
  39.                 p = p->next;
  40.                 p->next = NULL;
  41.         }
  42.         
  43. //        temp = head;
  44. //        head = head->next;
  45. //        free(temp);
  46.         
  47.         return head;
  48. }

  49. void px(list head,int first)
  50. {
  51.         list p = head;
  52.         list temp,temp2;
  53.         int t = first;
  54.         
  55.         while(head->next)
  56.         {
  57.                 if(head->next->address == t)
  58.                 {
  59.                         head = head->next;
  60.                         t = head->last;
  61.                 }
  62.                 else
  63.                 {
  64.                         p = head;
  65.                         while(p->next->address != t)
  66.                         {
  67.                                 p = p->next;
  68.                         }
  69.                         list s;
  70.                         s = p->next;
  71.                         temp = s->next;
  72.                         s->next = head->next;
  73.                         head->next = s;
  74.                         p->next = temp;
  75.                         head = head->next;
  76.                         t = head->last;
  77.                 }
  78.         }
  79.         
  80. }

  81. void fz(list head,int k)
  82. {
  83.         list p = (list)malloc(sizeof(struct List));
  84.         p->next = head->next;
  85.         list temp;
  86.         int flag = 0;

  87.         while(p->next)
  88.         {
  89.                 int i = 1;
  90.                 temp = dg(p,p,i,k);
  91.                 if(!flag)
  92.                 {
  93.                         flag = 1;
  94.                         head->next = p->next;
  95.                                 }
  96.                                 //if(temp)
  97.                                 p->next = temp;
  98.         }
  99. }

  100. list dg(list p,list head,int i,int k)
  101. {
  102.                 if(!p)
  103.                 return p;

  104.         list temp = NULL;
  105.         list perv = NULL;
  106.         if(i != k)
  107.         {
  108.                 perv = p;
  109.                 p = p->next;
  110.                 i++;
  111.                 temp = dg(p,head,i,k);
  112.         }
  113.         else
  114.         {
  115.                 head->next = p->next;
  116.                 temp =  p->next->next;
  117.                 p->next->next = p;
  118.                 p->next->last = p->address;
  119.                 if(!temp)
  120.                 {
  121.                         list N = (list)malloc(sizeof(struct List));
  122.                         N->next = NULL;
  123.                         N->data = -1;
  124.                         return N;
  125.                                 }
  126.                 return temp;

  127.         }
  128.         if(i == 2 && temp)
  129.                                 {
  130.                                         if(temp->data == -1)
  131.                                         {
  132.                                                 list t = temp;
  133.                                                 temp = NULL;
  134.                                                 free(t);
  135.                                                
  136.                                         }
  137.                                         p->next = temp;
  138.                                         if(!temp)
  139.                                         {
  140.                                                 p->last = -1;
  141.                                         }
  142.                                         else
  143.                                         p->last = temp->address;
  144.                                        
  145.                                 }               
  146.         else if(temp)
  147.                 {
  148.                         p->next = perv;
  149.                               p->last = perv->address;
  150.                                 }

  151.                
  152.         return temp;
  153. }

  154. int main(void)
  155. {
  156.         list head;
  157.         int first,n,k;
  158.         scanf("%d %d %d",&first,&n,&k);
  159.         head = read(n);
  160.         //print(head);
  161.         px(head,first);
  162.        // print(head);
  163.         fz(head,k);
  164.        print(head);

  165.         return 0;
  166. }
复制代码



测试1:正好全反转        K%N = 0 的情况下!
答案错误
       
测试2:K=1不用反转
答案错误

测试3:最大N,最后剩K-1不反转
答案错误

测试4:有多余结点不在链表上
答案错误

测试5:试例
00100 6 4
00000 4 99999
00100 1 12309
68237 6 -1
33218 3 00000
99999 5 68237
12309 2 33218
答案正确

测试6:K=N全反转
答案正确

代码已经相较于之前做出修改,但是还有4个测试点过不了,想了一晚上想破脑袋了。求大佬帮帮忙!十分感谢!
24ba02f0bc3cd082b9d8b7f1a9ea871.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-6-30 00:59:13 | 显示全部楼层
这个问题是一个常见的数据结构问题,涉及到链表的操作。你的代码已经有了一些正确的地方,但是仍然有一些地方需要修改和优化。为了解决这个问题,我们可以按照以下步骤进行:

1. 首先,我们需要根据给出的地址和节点信息构建链表。注意链表可能是非连续的,我们需要进行排序。
2. 其次,我们需要遍历链表,每次取出K个节点,然后反转这K个节点。
3. 如果剩余节点不足K个,那么我们就不反转剩余的节点。
4. 最后,我们需要将反转后的子链表重新连接起来。

下面是一个修改后的C语言代码示例:

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

  3. #define MAXSIZE 100010

  4. struct Node {
  5.     int addr, data, next;
  6.     int flag;
  7. } node[MAXSIZE];

  8. int cmp(const void* a, const void* b) {
  9.     struct Node* c = (struct Node*)a;
  10.     struct Node* d = (struct Node*)b;
  11.     if(c->flag != d->flag) {
  12.         return d->flag - c->flag;
  13.     } else {
  14.         return c->addr - d->addr;
  15.     }
  16. }

  17. int Reverse(int start, int end) {
  18.     while(start < end) {
  19.         struct Node temp = node[start];
  20.         node[start] = node[end];
  21.         node[end] = temp;
  22.         start++;
  23.         end--;
  24.     }
  25.     return 0;
  26. }

  27. int main() {
  28.     int firstAddr, N, K;
  29.     scanf("%d %d %d", &firstAddr, &N, &K);
  30.     for(int i = 0; i < N; i++) {
  31.         int addr;
  32.         scanf("%d", &addr);
  33.         scanf("%d %d", &node[addr].data, &node[addr].next);
  34.         node[addr].addr = addr;
  35.     }
  36.     int count = 0;
  37.     int p = firstAddr;
  38.     while(p != -1) {
  39.         node[p].flag = 1;
  40.         count++;
  41.         p = node[p].next;
  42.     }
  43.     qsort(node, MAXSIZE, sizeof(node[0]), cmp);
  44.     for(int i = 0; i < count / K; i++) {
  45.         Reverse(i * K, (i + 1) * K - 1);
  46.     }
  47.     for(int i = 0; i < count - 1; i++) {
  48.         printf("%05d %d %05d\n", node[i].addr, node[i].data, node[i+1].addr);
  49.     }
  50.     printf("%05d %d -1\n", node[count-1].addr, node[count-1].data);
  51.     return 0;
  52. }
复制代码


这个代码首先根据给出的地址和节点信息构建链表。注意链表可能是非连续的,我们使用一个flag来标记有效节点,并利用qsort函数进行排序。然后我们遍历链表,每次取出K个节点,然后反转这K个节点。如果剩余节点不足K个,那么我们就不反转剩余的节点。最后,我们需要将反转后的子链表重新连接起来。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-10 02:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表