给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。

题目描述

k 是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

示例:

给你这个链表:1->2->3->4->5
当 k = 2 时,应当返回: 2->1->4->3->5
当 k = 3 时,应当返回: 3->2->1->4->5

题解:

翻转考虑用栈进行实现,每k个进行翻转。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* reverseKGroup(ListNode* head, int k) {
        //用于指向翻转后对应的第一个节点,这样我就可以指向下一个结点
        ListNode* tmp_head = new ListNode(0);
        tmp_head->next = head;
        ListNode* tmp = tmp_head;

        //存放链表节点
        stack<ListNode* > s;

        //用于记录是否到第k个节点了
        int i=0;

        while(head!=NULL)
        {
            s.push(head);
            head = head->next;
            i++;

            //开始处理,依次弹出栈中节点
            if(i%k==0)
            {
                i=0;
                while(!s.empty())
                {
                    tmp->next = s.top();
                    tmp = tmp->next;
                    s.pop();
                }
                //指向下一个原链表节点,这样当不满足k个,就不用操作了
                tmp->next = head;
            }
        }

        return tmp_head->next;

    }
};