力扣25. K 个一组翻转链表

发布于:2024-04-07 ⋅ 阅读:(104) ⋅ 点赞:(0)

Problem: 25. K 个一组翻转链表

题目描述

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

思路

1.创建虚拟头节点dummy并将其next指针指向head,创建指针pre、end均指向dummy;
2.编写反转单链表的函数reverse
3.当end -> next 不为空时:

3.1.每次k个一组将end指针后移;
3.2.判断当end指针为空时直接退出循环;
3.3.创建nextP指针指向end -> next,strat指针指向pre -> next;end的next指针置空;
3.4.从start指向的节点开始反转链表,并使得pre的next指针指向其;
3.5.start的next指针指向nextP,使得原始链表能连接起来
3.6.使pre指针指向start指针,end指针指向pre指针

复杂度

时间复杂度:

O ( n ) O(n) O(n);其中 n n n为链表的长度

空间复杂度:

O ( n ) O(n) O(n)

Code

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    /**
     * A set of K reversed single-linked lists
     * 
     * @param head The head node of the list to be reversed
     * @param k Number of nodes to be reversed
     * @return ListNode*
     */
    ListNode* reverseKGroup(ListNode* head, int k) {
        //Create a virtual node 
        ListNode* dummy = new ListNode(INT_MIN);
        ListNode* pre = dummy;
        ListNode* end = dummy;
        dummy -> next = head;
        while (end -> next != nullptr) {
            //Each k is in a group
            for (int i = 0; i < k && end != nullptr; ++i) {
                //Pointer end moves back
                end = end -> next;
            }
            if (end == nullptr) {
                break;
            }
            ListNode* start = pre -> next;
            ListNode* nextP = end -> next;
            //disconnect
            end -> next = nullptr;
            //reverse k nodes and return the new headnode which 
            //is the last node of k nodes
            pre -> next = reverse(start);
            //connect next group k nodes by next pointer
            start -> next = nextP;
            pre = start;
            end = pre;
        }
        return dummy -> next;
    }

    /**
     * Reverse the single linked list
     * 
     * @param head The node of the list to be reversed
     * @return ListNode*
     */
    ListNode* reverse(ListNode* head) {
        ListNode* pre = nullptr;
        ListNode* cur = head;
        while (cur != nullptr) {
            ListNode* nextP = cur -> next;
            cur -> next = pre;
            pre = cur;
            cur = nextP;
        }
        return pre;
    }
};


网站公告

今日签到

点亮在社区的每一天
去签到