思路:利用栈的特性,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 herestack<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;}
};