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 已经有些忘记了。