这是我参与2022首次更文挑战的第5天,活动详情查看:2022首次更文挑战
给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
k 是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
虽然这是一道困难题,但是并没有那么难,我们昨天说的就是反转链表,今天K个一组的反转,我们只需要将我们的链表分成一段一段的来反转不就可以了吗?
思路我们有了,现在开始实现
class Solution {
public ListNode reverseKGroup(ListNode head, int k) {
//我们对链表是否为空或者单个做出判定,根据K的要求,如果K为1,我们不需要反转,我们都是直接返回我们的链表
if(head==null || head.next==null || k==1){
return head;
}
//定义新的节点,我们通过for循环的方式,将节点连接起来
ListNode nowlist = head;
for(int i=0; i<k;i++){
//如果,剩下的长度小于K,我们返回我们剩下的节点
if(nowlist==null){
return head;
}
//连接节点
nowlist=nowlist.next;
}
//调用我们自定义函数,来反转我们某一段的链表
ListNode newlist = reversal(head,nowlist);
//通过递归调用开始下一段的反转,函数完成将每一段节点连接起来
head.next=reverseKGroup(nowlist,k);
return newlist;
}
//head是需要反转的链表的起始部位,我们通过对比nowlist节点,来判断我们反转终止的位置
public ListNode reversal(ListNode head,ListNode nowlist){
ListNode right = null;
ListNode left = head;
while (left != nowlist) {
ListNode next = left.next;
left.next = right;
right = left;
left = next;
}
return right;
}
}