題目:
給你一個鏈表,每 k 個節(jié)點一組進行翻轉(zhuǎn)习寸,請你返回翻轉(zhuǎn)后的鏈表。
k 是一個正整數(shù)融涣,它的值小于或等于鏈表的長度。
如果節(jié)點總數(shù)不是 k 的整數(shù)倍剃斧,那么請將最后剩余的節(jié)點保持原有順序忽你。
示例:
給定這個鏈表:1->2->3->4->5
當 k = 2 時,應當返回: 2->1->4->3->5
當 k = 3 時根蟹,應當返回: 3->2->1->4->5
代碼:
class Solution {
public ListNode reverseKGroup(ListNode head, int k) {
ListNode dummy = new ListNode(0);
dummy.next = head; //使用啞結(jié)點
ListNode pre = dummy;
ListNode end = dummy;
while(end.next != null) { //如果end下一個還有節(jié)點糟秘,進入循環(huán)
for (int i=0; i<k && end != null; i++) { //end 移動到這組的最后
end = end.next;
}
if (end == null) break; //如果長度不夠一組,跳出循環(huán)
ListNode start = pre.next; //start為要反轉(zhuǎn)的 head
ListNode next = end.next; //end 的下一個節(jié)點保存到 next
end.next = null; //斷開組與后面的連接
pre.next = reverse(start); //連接反轉(zhuǎn)過的鏈表
start.next = next; //將反轉(zhuǎn)過的組與后面節(jié)點相連
pre = start; //重置 pre 和 end散庶,此時前面一組節(jié)點已經(jīng)反轉(zhuǎn)好,準備進入下一組
end = pre;
}
return dummy.next;
}
private ListNode reverse(ListNode head) {
ListNode pre = null;
ListNode cur = head;
while(cur != null) {
ListNode next = cur.next;
cur.next = pre;
pre = cur;
cur = next;
}
return pre;
}
}