k为2时
效果:
k=3时:
简单的方法,利用尾插法和递归解决问题。尾插法将链表翻转,递归来依次翻转k个链表。
k=3时示例:
设置头结点,头结点的下一个(循环时,用来将下一次循环的头结点保存下来),设置尾结点,即第k个结点;
先判断结点的数目,小于k时,返回head。
开始循环,k-1次即可!!!
大于k时:
首先将head指向tail的下一个:
然后将尾结点指向头结点:
第一次进行尾插法,要使用一个flag=true,让newHead.next=reverseKGroup(tail.next,k);执行递归,第一次插完后只需要让newHead.next=tail.next即可。
结束后tail就会到头结点的位置,返回即可
java代码如下
class Solution {
public static ListNode reverseKGroup(ListNode head, int k) {
//计算head的长度
ListNode countHead=head;
//计数器
int count=0;
while (countHead!=null){
countHead=countHead.next;
count++;
}
//如果长度小于k,直接返回
if(count<k){
return head;
}
//设置新头结点
ListNode newHead=head;
//设置头结点的下一个结点,交换结点后头结点可以找到原始链表的下一个结点
ListNode nextHead=head.next;
//设置标记,只有第一次将头结点放在尾结点的后面时使用递归
boolean flag=true;
//设置尾结点,为第k个结点
ListNode tail=head;
for(int i=0;i<k-1;i++){
tail=tail.next;
}
//循环k-1次将链表反转,尾插法
for(int i=0;i<k-1;i++){
if(flag){
//利用尾插法,依次将头结点插入tail后面,头节点指向下一组
newHead.next=reverseKGroup(tail.next,k);
flag=false;
}else{
newHead.next=tail.next;
}
tail.next=newHead;
//头结点变成原来头结点下一个
head=nextHead;
//头结点下一个往下走
nextHead=nextHead.next;
//
newHead=head;
}
//反转结束后,尾结点为第一个了,返回就行
return tail;
}
}