【Leetcode】25.K个一组翻转链表C++(用栈解决)

在这里插入图片描述
在这里插入图片描述

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

// k 是一个正整数,它的值小于或等于链表的长度。

// 如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

#include "iostream"

#include "stack"

using namespace std;

struct ListNode
{
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};

class Solution
{
public:
    void print(ListNode *head)
    {
        ListNode *p = head;
        while (p != NULL)
        {
            cout << p->val << " ";
            p = p->next;
        }
        cout << endl;
    }
    ListNode *reverseKGroup(ListNode *head, int k)
    {
        if (head == NULL)
        {
            return NULL;
        }
        else if (head->next == NULL)
        {
            return head;
        }

        ListNode *node = new ListNode(0);
        node->next = head;
        ListNode *p = node, *f = node, *s;

        bool flag = true;
        stack<ListNode *> k_node;

        // 1 2 3 4 5
        // k = 3

        while (true)
        {
            for (int i = 0; i < k; i++)
            {
                p = p->next;
                if (p == NULL)
                {
                    flag = false;
                    break;
                }
                k_node.push(p);
            }

            if (flag)
            {
                p = p->next;
                while (!k_node.empty())
                {
                    f->next = k_node.top();
                    k_node.pop();
                    f = f->next;
                }
                f->next = p;
                p = f;
            }
            else
            {
                break;
            }
        }

        return node->next;
    }
};

int main(int argc, char const *argv[])
{
    int k, x;
    ListNode *p, *head;

    cout << "k=";
    cin >> k;

    cin >> x;
    head = new ListNode(x);
    p = head;
    while (true)
    {
        cin >> x;
        p->next = new ListNode(x);
        p = p->next;
        if (cin.get() == '\n')
            break;
    }

    Solution so;
    head = so.reverseKGroup(head, k);
    so.print(head);

    return 0;
}
发布了103 篇原创文章 · 获赞 128 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_44936889/article/details/104089852