繁琐的链表操作,很开心,一次就过了,不过推敲的时间也有20分钟了,
还是加快思考的速度。
1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * ListNode *next; 6 * ListNode(int x) : val(x), next(NULL) {} 7 * }; 8 */ 9 class Solution { 10 public: 11 ListNode *reverseKGroup(ListNode *head, int k) { 12 // Start typing your C/C++ solution below 13 // DO NOT write int main() function 14 if (head == NULL || k <= 1) { 15 return head; 16 } 17 ListNode *first = getKNode(head, k); 18 if (first == head) { 19 return head; 20 } 21 ListNode *res = first; 22 ListNode *start = first->next; 23 reverse(head, first); 24 ListNode *pre = head; 25 while (start) { 26 first = getKNode(start, k); 27 if (first == start) { 28 pre->next = start; 29 return res; 30 } 31 pre->next = first; 32 pre = start; 33 ListNode *temp = first->next; 34 reverse(start, first); 35 start = temp; 36 } 37 if (start == NULL) { 38 pre->next = NULL; 39 return res; 40 } 41 return res; 42 } 43 ListNode *getKNode(ListNode *head, int k) { 44 ListNode *first = head; 45 int count = 1; 46 while (first->next && count < k) { 47 first = first->next; 48 ++count; 49 } 50 if (first->next == NULL && count < k) { 51 return head; 52 } 53 return first; 54 } 55 void reverse(ListNode *start, ListNode *end) { 56 ListNode *pre = start; 57 ListNode *iter = start->next; 58 while (iter != end) { 59 ListNode *temp = iter->next; 60 iter->next = pre; 61 pre = iter; 62 iter = temp; 63 } 64 end->next = pre; 65 } 66 };