**固定题目二**【用C/C++实现】K 个一组翻转链表
给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
k 是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
示例 :
给定这个链表:1->2->3->4->5
当 k = 2 时,应当返回: 2->1->4->3->5
当 k = 3 时,应当返回: 3->2->1->4->5
说明 :
* 你的算法只能使用常数的额外空间。
* 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
首先注意以下几点:
1、代码目录结构
2、注意类设计,避免纯c写法
3、要在Linux下运行
4、要有标准的单测文件+测试用例
这个是链表操作基础啊
#include<stdio.h>
#pragma warning(disable:4996)
struct ListNode
{
int value;
ListNode *next;
};
ListNode * inverse(ListNode * head){
ListNode * prev = nullptr;
ListNode * nodeNext = nullptr;
ListNode * next = nullptr;
prev = head;
while (prev != NULL)
{
next = prev->next;
prev->next = nodeNext;
nodeNext = prev;
prev = next;
}
return nodeNext;
}
int main(){
// 头指针
ListNode *head = new ListNode;
// 结点指针
ListNode * s = nullptr;
// 辅助指针
ListNode * p = nullptr;
int i = 0;
// 当前指针
p = head;
while (i < 5){
// 新建节点
s = new ListNode;
s->value = ++i;
s->next = nullptr;
// 做连接,但不能用 head连,否则循环一直是head指针
// head->next = s;
// 所以使用p连
p->next = s;
// 将 p 向右移动
p = s;
}
int k;
scanf("%d", &k);
int head_count = 5 / k;
int head_per = 5 % k;
if (k != 0){
head_count++;
}
ListNode ** heads = new ListNode *[head_count];
i = 0;
int j = 0;
int remain = 5;
p = head->next;
ListNode * h = new ListNode;
ListNode * n = new ListNode;
n = h;
while (p != NULL){
s = p->next;
p->next = nullptr;
n->next = p;
n = p;
i++;
remain--;
if (i == k){
heads[j] = h;
j++;
i = 0;
h = new ListNode;
n = h;
}
if (remain == 5 % k){
heads[j] = s;
break;
}
p = s;
}
p = nullptr;
ListNode * new_head = new ListNode;
ListNode * next = nullptr;
for (i = 0; i < 5 / k; i++){
if (i == 0){
s = inverse(heads[i]->next);
next = heads[i]->next;
new_head = s;
}
else{
s = inverse(heads[i]->next);
next->next = s;
next = heads[i]->next;
}
}
if (5 % k != 0){
next->next = heads[head_count - 1];
}
s = new_head;
// 输出整个单链表
while (1) {
if (NULL == s) {
printf("\n");
break;
}
printf("->%d", s->value);
s = s->next;
}
printf("");
}
这个是对的
这里有个java版本的,你可以参考下,采纳后可以帮你用c++写
https://blog.csdn.net/weixin_38426554/article/details/98669590
您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632
非常感谢您使用有问必答服务,为了后续更快速的帮您解决问题,现诚邀您参与有问必答体验反馈。您的建议将会运用到我们的产品优化中,希望能得到您的支持与协助!
速戳参与调研>>>https://t.csdnimg.cn/Kf0y