給出一個(gè)鏈表踢涌,每 k 個(gè)節(jié)點(diǎn)一組進(jìn)行翻轉(zhuǎn),并返回翻轉(zhuǎn)后的鏈表序宦。
k 是一個(gè)正整數(shù)睁壁,它的值小于或等于鏈表的長度。如果節(jié)點(diǎn)總數(shù)不是 k 的整數(shù)倍互捌,那么將最后剩余節(jié)點(diǎn)保持原有順序潘明。
示例 :
給定這個(gè)鏈表:1->2->3->4->5
當(dāng) k = 2 時(shí),應(yīng)當(dāng)返回: 2->1->4->3->5
當(dāng) k = 3 時(shí)秕噪,應(yīng)當(dāng)返回: 3->2->1->4->5
說明 :
- 你的算法只能使用常數(shù)的額外空間钳降。
- 你不能只是單純的改變節(jié)點(diǎn)內(nèi)部的值,而是需要實(shí)際的進(jìn)行節(jié)點(diǎn)交換腌巾。
代碼
public ListNode reverseKGroup(ListNode head, int k) {
ListNode ans = new ListNode(Integer.MAX_VALUE);
ans.next = head;
ListNode p = ans;
while (ok(p.next, k)) {
p = reverse(p, k);
}
return ans.next;
}
private boolean ok(ListNode p, int k) {
while (k > 0 && p != null) {
p = p.next;
k--;
}
return k == 0;
}
private ListNode reverse(ListNode front, int k) {
ListNode from = front.next;
ListNode head = from;
ListNode cur = from.next;
ListNode tmp = null;
while (k > 1 && cur != null) {
tmp = cur.next;
cur.next = from;
from = cur;
cur = tmp;
k--;
}
head.next = cur;
front.next = from;
return head;
}