/**
*
* Given a linked list, reverse the nodes of a linked list k at a time and return its modified list.
*
* If the number of nodes is not a multiple of k then left-out nodes in the end should remain as it is.
*
* You may not alter the values in the nodes, only nodes itself may be changed.
*
* Only constant memory is allowed.
*
* For example,
* Given this linked list: 1->2->3->4->5
*
* For k = 2, you should return: 2->1->4->3->5
*
* For k = 3, you should return: 3->2->1->4->5
*
*/
public class ReverseNodesInKGroup {
public class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
next = null;
}
}
//递归版
// 81 / 81 test cases passed.
// Status: Accepted
// Runtime: 262 ms
// Submitted: 0 minutes ago
public ListNode reverseKGroup(ListNode head, int k) {
if(head == null || k < 2) return head;
ListNode node = head;
for(int i = 1; i < k; i++) {
if(node.next != null)
node = node.next;
else
return head; //少于k个,直接返回
}
ListNode more = node.next; //标记是否多于k个节点
//对当前这k个节点反转
node.next = null; //掐断当前k个节点
ListNode cursor = head.next;
ListNode tail = head; //标记尾节点
while(cursor != null) {
ListNode temp = cursor;
cursor = cursor.next;
temp.next = head;
head = temp;
}
if(more == null) //无更多节点
tail.next = null;
else
tail.next = reverseKGroup(more, k);
return head;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}