思路:利用栈的特性,K个节点压入栈中依次弹出组成新的链表,不够K个节点则保持不变
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) : val(x), next(nullptr) {}
* };
*/
#include <stack>
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param head ListNode类
* @param k int整型
* @return ListNode类
*/
ListNode* reverseKGroup(ListNode* head, int k) {
// write code here
stack<ListNode*> sk;//用来保存链表节点
ListNode* temp = head;
ListNode* ret = new ListNode(-1);
ListNode* ret1 = ret;
//按k个节点一次一次去遍历链表
while(1){
int count = k;
//K个节点之内依次push入栈中
while(count&&temp){
sk.push(temp);
temp = temp->next;
count--;
}
//如果push完了还不够数量则该次不需要反转链表反转保持原型进行链接,从而跳出循环
if(count){
//下一阶段的第一个节点
ret1->next = head;//这句不能省略的原因是如果k大于链表的长度,没有这句话return结果为空,但是应该是该链表
break;
}
//如果够数量则从栈中弹出加入结果链表中
while(!sk.empty()){
ret1->next = sk.top();
sk.pop();
ret1 = ret1->next;
}
//结果链表的下一节点指向后面的链表
ret1->next = temp;
head = temp;
}
return ret->next;
}
};