C++经典面试题 求解答

**固定题目二**【用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