![##](https://img-blog.csdnimg.cn/20210528100436233.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L01pa29uXzA3MDM=,size_16,color_FFFFFF,t_70)
leetcode25
递归:翻转第一组后,以第二组的开头为头节点
- 找到从head开始的第K个节点,记为tail
- 翻转head到tail的前一个节点,返回的头节点记为newHead
- 以tail为头节点,递归
- 每一次递归结束后,将head.next= 下一步翻转得到的newHead
public ListNode reverseKGroup (ListNode head, int k) {
// 先判断空指针
if(head ==null || head.next ==null){
return head;
}
// 找到待翻转的k个节点,若剩余数量小于 k 的话,则不需要反转
ListNode tail = head;
for(int i=0;i<k;i++){
if(tail==null){
return head;
}
tail =tail.next;
}
// 翻转之后 返回的新的头节点
ListNode newHead = reverse(head,tail);
// 以tail为头节点,递归
head.next = reverseKGroup(tail,k);
// 返回头节点
return newHead;
// 翻转链表
private ListNode reverse(ListNode head,ListNode tail){
ListNode pre = null;
ListNode temp = null;
while(head != tail){
// 暂时保存
temp = head.next;
// 改变指针方向
head.next =pre;
pre = head
head = temp;
}
return pre
翻转链表