【leetcode100-031】【链表】k个一组翻转链表

【题干】

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

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

你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。

【思路】

  • 非递归折腾一早上了都超时,写个递归版吧
  • 拿到一条链表,我们可以将其分为已处理部分,正在处理部分,待处理部分;
  • 我们每次从待处理部分取出一组k个节点(若还够取),更新待处理部分的起始位置(下一层递归的传入参数),进行处理,并把处理完的结果接到已处理部分的尾部(递归主体),直到待处理部分已不足k个(递归出口);
  • 本题有大量细节需要处理,每一个指针变动都要小心丢链~

【题解】

class Solution {
public:
    ListNode* reverseKGroup(ListNode* head, int k) {
        if (head == NULL) return NULL;
        ListNode *a = head;
        ListNode *b = head;
        for (int i = 0; i < k; i++) {
            if (b == NULL) return head;
            b = b->next;
        }

        ListNode *newNode = reverseOperator(a,b);
        a->next = reverseKGroup(b,k);
        return newNode;
    }

    ListNode* reverseOperator(ListNode* n,ListNode *b) {
        ListNode *pre, *cur, *nxt;
        pre = NULL; cur = n; nxt = n;
        while (cur != b) {
            nxt = cur->next;
            cur->next = pre;
            pre = cur;
            cur = nxt;
        }
        return pre;
    }
};

你可能感兴趣的:(leetcode100思路整理,链表,算法,数据结构)