Reverse linked list in k-Group
這題用到所有 linked list 該考的東西
這種題目把圖畫出來較容易理解,
我們可以這樣做:
一個輔助函數,每次返回反轉 K個後的最後一個,這樣下一次就又可以反轉
不足 K個就回傳空,
但這樣第一個要怎辦? 我們就用 dummy node表示
public ListNode reverseKGroup(ListNode head, int k) {
// write your code here
if (head == null) {
return head;
}
ListNode dummy = new ListNode(0);
dummy.next = head;
head = dummy;
while (head != null) {
head = reverseNextK(head, k);
}
return dummy.next;
}
//head -> n1 -> n2 -> ... nk -> nk+1
//=>
//head -> nk -> nk-1 -> .. n1 -> nk+1
//return n1
//return the next of reverse K
public ListNode reverseNextK(ListNode head, int k) {
ListNode n1 = head.next;
ListNode nk = head;
for (int i = 0; i < k; i++) {
nk = nk.next;
if (nk == null) {
return null;
}
}
//reverse
ListNode nk_plus = nk.next;
ListNode prev = null;
ListNode cur = n1;
while (cur != nk_plus) {
ListNode tmp = cur.next;
cur.next = prev;
prev = cur;
cur = tmp;
}
//connect
head.next = nk;
n1.next = nk_plus;
return n1;
}