链表中的节点每k个一组翻转
题目描述
思路
递归解法
先循环k次找到tail进行分组切段,每次先找到新的一段的tail作为下一次操作的head,反转每一小段,然后连接好后面反转好的链表
步骤
- 循环遍历新的小段k次找到tail,判断新的头结点head是否可以能循环k次得到tail即能够得到新的小段,得不到直接返回head,不进行反转
- 新的head能够循环k次,将这一小段进行反转
- 传入本次操作的tail,作为下一次操作的head
- 返回pre
代码
import java.util.*;
public class Solution {
public ListNode reverseKGroup (ListNode head, int k) {
//找到每次翻转的尾部
ListNode tail = head;
//遍历k次到尾部
for(int i = 0; i < k; i++){
//如果不足k到了链表尾,直接返回,不翻转
if(tail == null)
return head;
tail = tail.next;
}
//翻转时需要的前序和当前节点
ListNode pre = null;
ListNode cur = head;
//在到达当前段尾节点前
while(cur != tail){
//翻转
ListNode temp = cur.next;
cur.next = pre;
pre = cur;
cur = temp;
}
//当前尾指向下一段要翻转的链表
head.next = reverseKGroup(tail, k);
return pre;
}
}