给定一个单链表的头节点 head,实现一个调整单链表的函数,使得每K个节点之间为一组进行逆序,并且从链表的尾部开始组起,头部剩余节点数量不够一组的不需要逆序。(不能使用队列或者栈作为辅助)
例如:
链表:1->2->3->4->5->6->7->8->null, K = 3。那么 6->7->8,3->4->5,1->2各位一组。调整后:1->2->5->4->3->8->7->6->null。其中 1,2不调整,因为不够一组。
public class test {
public ListNode baidu(ListNode head, int k) {
if (head == null || k == 1) {
return head;
}
int size = 0;
ListNode tmp = head;
while (tmp != null) {
tmp = tmp.next;
size++;
}
int s = size % k;
ListNode a = head;
for (int i = 0; i < s - 1; i++) {
a = a.next;
}
ListNode b = a.next;
a.next = reverseK(b, k);
return head;
}
private ListNode reverseK(ListNode b, int k) {
if (b == null) {
return null;
}
ListNode tail = b;
for (int i = 0; i < k - 1; i++) {
tail = tail.next;
}
ListNode next = tail.next;
tail.next = null;
reverse(b);
b.next = reverseK(next, k);
return tail;
}
private void reverse(ListNode head) {
ListNode pre = null;
ListNode cur = head;
while (cur != null) {
ListNode next = cur.next;
cur.next = pre;
pre = cur;
cur = next;
}
}
}