Reverse Nodes in k-Group Hard
Given a linked list, reverse the nodes of a linked list k at a time and return its modified list.
k is a positive integer and is less than or equal to the length of the linked 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 ListNode reverseKGroup(ListNode head, int k) { if (head == null || head.next == null || k < 2) return head; ListNode dummy = new ListNode(0); dummy.next = head; ListNode tail = dummy, prev = dummy, temp; int count; while (true) { count = k; while (count > 0 && tail != null) { count--; tail = tail.next; } if (tail == null) break; head = prev.next; while (prev.next != tail) { temp = prev.next;//cache head prev.next = temp.next;//Delete head,这时指向第二结点 temp.next = tail.next;//Point to after tail.next = temp;//put head at the end of the list } tail = head; prev = head; } return dummy.next; } 思路:每次处理k个结点,三个指针,分别指头、尾和当前元素(temp),使用temp不断把头部元素移动到尾部(头尾分别向中间前进一位),直到头尾指到一处,再进行下一个k的处理。每次k结点的开头(pre)总是上k个的结尾结点,即未翻转时的头结点。