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

给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。

思路:

使用头插法翻转链表。对于由k个结点组成的一个翻转组,用pre指向翻转组首结点的前驱结点,tail指向翻转组的尾结点,用n计数已访问的结点数。

每当找到k个结点,用p指向pre->next,把p之后的结点用头插法放在pre之后,重复k-1次,最后p指向翻转组的尾结点.

class Solution {
public:
    ListNode* reverseKGroup(ListNode* head, int k) {
        ListNode* h = new ListNode(-1);
        h->next = head;
        ListNode* pre = h;
        ListNode* tail = head;
        int n = 0;

        while (tail != NULL) {
            if (++n % k == 0) {
                ListNode* p = pre->next;
                for (int i = 0; i < k - 1; i++) {
                    ListNode* q = p->next;
                    p->next = q->next;
                    q->next = pre->next;
                    pre->next = q;
                }
                pre = p;
                tail = p->next;
            } else {
                tail = tail->next;
            }
        }
        return h->next;
    }
};

你可能感兴趣的:(leetcode,链表,算法)