25. Reverse Nodes in k-Group
題目
給出一個鏈表,每次翻轉鏈表的K個結點,返回修改後的鏈表。
k是正整數,並且小於等於鏈表長度。如果結點的數目不是k的倍數,最後剩下的不到K個結點保持原樣。
比如:
給出鏈表: 1->2->3->4->5
當 k = 2, 你應該返回:2->1->4->3->5
當 k = 3,你應該返回: 3->2->1->4->5
注意:
空間複雜度爲O(1)
代碼塊
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode reverseKGroup(ListNode head, int k) {
if(head == null || head.next == null) return head;
ListNode dummyNode = new ListNode(0);
dummyNode.next = head;
ListNode pre = dummyNode;
ListNode left = head;
ListNode right = head.next;
ListNode checkNode = head;
while(true){
for(int i = 0; i < k; i++){
if(checkNode == null){
return dummyNode.next;
}
checkNode = checkNode.next;
}
for(int i = 0; i < k - 1; i++){
left.next = right.next;
//right.next = left;
right.next = pre.next;//正確
pre.next = right;
//right = right.next;
right = left.next;//正確
}
pre = left;
left = right;
if(right == null){
return dummyNode.next;
}else{
right = right.next;
}
}
}
}
代碼分析
本題是幾道題目的結合,reverse linked listII 和swap in pairs. 套用了swap 的循環方法(while)以及使用反轉鏈表作爲循環體。
1. 涉及到head的變化,所以要用dummyNode。
2. 還需要用checkNode來檢查是不是滿足k的倍數。
3. 最後使用了三個結點pre,left , right來進行變換。
注意要搞清楚怎麼變化的,誰指向誰,還是需要背加理解。reverse 已經有些忘記了。