思路:
1)设置一个带头节点的指针hair,这个指针不动,用于最后返回链表
2)设置一个pre,一个end指针,都放在hair处,也就是第一个节点的前一个节点
pre用于每次翻转完记住起始位置,end用于往后遍历k个节点
3)每次遍历设置一个start指针,用于和end传入函数中进行翻转操作
代码:
class Solution {
public ListNode reverseKGroup(ListNode head, int k) {
ListNode hair=new ListNode(0);
hair.next=head;
ListNode pre=hair;
ListNode end=hair;
while(end.next!=null){
for(int i=0;i<k&&end!=null;i++){
end=end.next;
}
//以下条件不可忽略
if(end==null) break;
ListNode start=pre.next;
ListNode next=end.next;
//此处的目的是调用reverse函数时,使得start后面的节点只有2个(包括子函数)
end.next=null;
//翻转后的链表与原先的重新接上
pre.next=reverse(start);
start.next = next;
pre = start;
end = pre;
}
return hair.next;
//以上一共声明了hair,pre,start,end,next五个指针
}
private ListNode reverse(ListNode start){
ListNode pre=new ListNode(0);
ListNode curr=start;
//设置空指针让start=空指针
while(curr!=null){
ListNode next=curr.next;
curr.next=pre;
pre=curr;
curr=next;
}
return pre;
}
}
分解:
1)每次翻转完start和end指针都交换了位置
2)每次翻转完pre和end都放在start的位置(翻转后的start,相当于之前的end的位置)
3)翻转函数的代码分析