跳转至

25.K 个一组翻转链表 (Hard)*

题目描述*

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

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

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

示例*

给定这个链表:1->2->3->4->5

当 k = 2 时,应当返回: 2->1->4->3->5

当 k = 3 时,应当返回: 3->2->1->4->5

说明*

  • 你的算法只能使用常数的额外空间。
  • 你不能只是单纯的改变结点内部的值,而是需要实际的进行结点交换。

代码*

链表反转很简单,主要就是要每 k 个截断,然后不足的不反转。迭代最好把图画出来,不然脑子想不太出来。

class Solution {
public:
    ListNode* reverseKGroup(ListNode* head, int k) {
        if(head == nullptr) {
            return nullptr;
        }
        ListNode *p = head;
        int i = k;
        while(i > 1) {
            p = p->next;
            if(p == nullptr) {
                return head;
            }
            i--;
        }
        ListNode *nextHead = p->next;
        p->next = nullptr;
        ListNode *newHead = reverse(head);
        head->next = reverseKGroup(nextHead, k);
        return newHead;
    }
    ListNode* reverse(ListNode *head) {
        ListNode *slow = nullptr, *fast = head;
        while(fast != nullptr) {
            ListNode *p = fast->next;
            fast->next = slow;
            slow = fast;
            fast = p;
        }
        return slow;
    }
};
class Solution {
public:
    ListNode* reverseKGroup(ListNode* head, int k) {
        ListNode *dummy = new ListNode(-1);
        dummy->next = head;
        ListNode *slow = dummy, *fast = dummy;
        while(fast->next != nullptr) {
            for(int i = 0; i < k && fast != nullptr; i++) {
                fast = fast->next;
            }
            if(fast == nullptr) {
                break;
            }
            ListNode *curHead = slow->next;
            ListNode *nextHead = fast->next;
            fast->next = nullptr;
            slow->next = reverse(curHead);
            curHead->next = nextHead;
            slow = curHead;
            fast = slow;
        }
        return dummy->next;
    }
    ListNode* reverse(ListNode* head) {
        ListNode *slow = nullptr, *fast = head;
        while(fast != nullptr) {
            ListNode *p = fast->next;
            fast->next = slow;
            slow = fast;
            fast = p;
        }
        return slow;
    }
};

最后更新: July 23, 2022