使用递归的方式,递归截至的条件为链表为NULL。
每次递归,反转K个节点完成后,将将链表尾指向下次递归的返回值。
如果某一次递归反转后,未达到K个节点,表示节点数小于K,则将链表恢复原状后(重新反转)返回即可。
代码 如下。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
typedef struct ListNode Node;
Node *reverseList(Node *head){
Node *front = head;
Node *mid = NULL;
Node *rear = NULL;
if(!head){
return NULL;
}
while(front){
rear = mid;
mid = front;
front = front->next;
mid->next = rear;
}
return mid;
}
struct ListNode* reverseKGroup(struct ListNode* head, int k) {
int i=0;
Node *front = head;
Node *mid = NULL, *rear = NULL;
if(!head){
return NULL;
}
while(front){
rear = mid;
mid = front;
front = front->next;
mid->next = rear;
i++;
if(i==k){
head->next = reverseKGroup(front, k);
return mid;
}
}
return reverseList(mid);
}