【题干】
给你链表的头节点 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;}
};