题目
给出一个链表,每 k 个节点一组进行翻转,并返回翻转后的链表。
k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么将最后剩余节点保持原有顺序。
示例 :
给定这个链表:1->2->3->4->5
当 k = 2 时,应当返回: 2->1->4->3->5
当 k = 3 时,应当返回: 3->2->1->4->5
说明 :
你的算法只能使用常数的额外空间。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
思路
递归,大致思路类似 https://blog.csdn.net/qq_36025975/article/details/84585979。
不同之处在于需要翻转链表。
代码
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode reverseKGroup(ListNode head, int k) {
ListNode headcopy=head;
// 计算链表长度
int length=0;
while(true){
if(head==null){
break;
}
length++;
head=head.next;
if(length>=k){
break;
}
}
head=headcopy;
// 链表长度<k 什么也不做
if(length<k){
return head;
}
if(k==1){
return head;
}
// 链表长度>=k 将前k个结点为一组进行翻转
ListNode s=head;
ListNode e=head;
ListNode f=head.next;
// k个结点中已经翻转的结点数量
int reversecount=1;
while(true){
if(reversecount==k-1){
// 翻转第k个结点
e.next=reverseKGroup(f.next,k);
f.next=s;
s=f;
break;
}else{
// 翻转前<k个结点
e.next=f.next;
f.next=s;
s=f;
f=e.next;
reversecount++;
}
}
return s;
}
}