思路: 1.每K个反转,这个好实现。我们新建一个节点newHead ,初始化为-1,copy 出副本进行操作headPointer,每次遍历节点,它的next指向当前节点,方便下一次遍历的时候,下一个节点可以指向它。如果刚好到k了,那我们headPointer指向当前遍历周期开始的节点。主要是为了能够无缝衔接下一个周期节点。headPointer 主要是为了操作一个周期k个节点中,保存前一个节点,相当于反转链表的pre节点。 2.如果不足k个,我们已经反转了,那就需要再次反转一下。 多理解下
/*
* public class ListNode {
* int val;
* ListNode next = null;
* }
*/
public class Solution {
/**
*
* @param head ListNode类
* @param k int整型
* @return ListNode类
*/
public ListNode reverseKGroup (ListNode head, int k) {
// write code here
if(k<=0 || head == null){
return head;
}
ListNode newHead = new ListNode(-1);
ListNode currentNode = head;
ListNode headPointer = newHead;
while(true){
int i = 0;
ListNode nextStepNode = currentNode;
ListNode next;
while(i < k && currentNode != null){
next = currentNode.next;
currentNode.next = headPointer.next;
headPointer.next = currentNode;
currentNode = next;
i++;
}
if(i == k){
headPointer = nextStepNode;
}else{
for(currentNode = headPointer.next ,headPointer.next = null; currentNode != null;){
next = currentNode.next;
currentNode.next = headPointer.next;
headPointer.next = currentNode;
currentNode = next;
}
break;
}
}
return newHead.next;
}
}