25. Reverse Nodes in k-Group Posted on 2020-05-31 Edited on 2021-01-25 In LeetCode Disqus: Symbols count in article: 2k Reading time ≈ 2 mins. recursive O(n)这个更清楚 12345678910111213141516171819# Definition for singly-linked list.# class ListNode:# def __init__(self, val=0, next=None):# self.val = val# self.next = nextclass Solution: def reverseKGroup(self, head: ListNode, k: int) -> ListNode: p = head for i in range(k): if not p: return head p = p.next curr, prev = head, self.reverseKGroup(p, k) for i in range(k): succ = curr.next curr.next = prev prev = curr curr = succ return prev 123456789101112131415161718192021222324252627/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: ListNode* reverseKGroup(ListNode* head, int k) { auto p = head; int i = 0; for (; i < k && p; ++i) { p = p->next; } if (i < k) return head; auto prev = reverseKGroup(p, k), curr = head; while (k-- > 0) { auto succ = curr->next; curr->next = prev; prev = curr; curr = succ; } return prev; }}; 123456789101112131415161718192021222324252627/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: ListNode* reverseKGroup(ListNode* head, int k) { auto p = head; int t = k; // 这里不能用k因为后边还得用 while (t-- > 0 && p) { p = p->next; } if (t >= 0) return head; // 这里检查尾部较短的部分,必须统计t因为p为nullptr时也可能需要reverse,并且t == 0也是有可能的因为t最后还要-- auto prev = reverseKGroup(p, k), curr = head; // 一个正常的翻转链表操作 while (k-- > 0) { auto succ = curr->next; curr->next = prev; prev = curr; curr = succ; } return prev; }}; 12345678910111213141516171819202122232425/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: ListNode* reverseKGroup(ListNode* head, int k) { auto p = head; int i = 0; for (; i < k && p; ++i, p = p->next); if (i < k) return head; auto prev = reverseKGroup(p, k), curr = head; for (int i = 0; i < k; ++i) { auto succ = curr->next; curr->next = prev; prev = curr; curr = succ; } return prev; }};