从这题和上一题可以总结出反转链表的经验,需要有5个指针:end, q, p, pPre, pNext. p和pPre进行方向转置后p和pPre向后移,pNext用来记录转置前p的后一个,q用来记录转置串之前的node,end记录转置串最开始的node。
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 below13 // DO NOT write int main() function14 ListNode *pPre, *end, *p, *q;15 p = head;16 q = NULL;17 bool flag = true;18 while (flag) {19 end = pPre = p;20 ListNode *tmp = pPre;21 for (int i = 0; i < k; i++) {22 if (tmp) tmp = tmp->next;23 else {24 flag = false;25 break;26 }27 }28 if (!flag) break;29 p = p->next;30 for (int i = 0; i < k-1; i++) {31 ListNode *pNext = p->next;32 p->next = pPre;33 pPre = p;34 p = pNext;35 }36 end->next = p;37 if (!q) head = pPre;38 else q->next = pPre;39 q = end;40 }41 return head;42 }43 };
recursive的方法更好理解
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 if (!head) return NULL;13 ListNode *p = head;14 int len = 0;15 for (; p && len < k; p = p->next) len++;16 if (len < k) return head;17 ListNode *pre = NULL;18 p = head;19 for (int i = 0; i < k; ++i) {20 ListNode *pnext = p->next;21 p->next = pre;22 pre = p;23 p = pnext;24 }25 head->next = reverseKGroup(p, k);26 return pre;27 }28 };
C#
1 /** 2 * Definition for singly-linked list. 3 * public class ListNode { 4 * public int val; 5 * public ListNode next; 6 * public ListNode(int x) { val = x; } 7 * } 8 */ 9 public class Solution {10 public ListNode ReverseKGroup(ListNode head, int k) {11 if (head == null) return null;12 ListNode p = head;13 int len = 0;14 for (; p != null && len < k; p = p.next) len++;15 if (len < k) return head;16 ListNode pre = null;17 p = head;18 for (int i = 0; i < k; i++) {19 ListNode pNext = p.next;20 p.next = pre;21 pre = p;22 p = pNext;23 }24 head.next = ReverseKGroup(p, k);25 return pre;26 }27 }