package com.heu.wsq.niuke.top200;
/**
* 链表中的节点每k个一组反转
* @author wsq
* @date 2021/05/14
*
* 题目描述
* 将给出的链表中的节点每k个一组翻转,返回翻转后的链表
* 如果链表中的节点数不是k的倍数,将最后剩下的节点保持原样
* 你不能更改节点中的值,只能更改节点本身。
* 要求空间复杂度 O(1)
*
* 例如:
* 给定的链表是1→2→3→4→5
* 对于k=2, 你应该返回 2→1→4→3→5
* 对于k=3, 你应该返回 3→2→1→4→5
*
* 示例1
* 输入:
* {1,2,3,4,5},2
* 输出:
* {2,1,4,3,5}
*/
public class ReverseKGroup {
/**
*
* @param head ListNode类
* @param k int整型
* @return ListNode类
*/
public ListNode reverseKGroup (ListNode head, int k) {
// write code here
if(head == null || k == 0){
return head;
}
// k个节点一反转,小于k个节点的直接返回
// right指针是k个元素的末尾,反转之后,该指针为新的头节点
int count = 0;
ListNode right = head;
while(right != null){
count++;
if(count == k){
break;
}
right = right.next;
}
// count等于k将节点head到right的节点进行反转
if(count == k){
ListNode tmp = right.next;
reverse(head, right);
head.next = reverseKGroup(tmp, k);
}else{
return head;
}
return right;
}
/**
* 反转链表
* @param left
* @param right
*/
private void reverse(ListNode left, ListNode right){
if(left == right){
return;
}
ListNode prev = null;
ListNode curr = left;
while(curr != right){
ListNode tmp = curr.next;
curr.next = prev;
prev = curr;
curr = tmp;
}
if(curr != null){
curr.next = prev;
}
}
}
链表中的节点每k个一组反转(递归,链表反转)
最新推荐文章于 2023-07-07 10:12:36 发布
这篇博客介绍了一个Java实现的算法,用于将链表中的节点每k个一组进行反转。代码中定义了一个`ReverseKGroup`类,包含`reverseKGroup`方法来处理反转操作,并使用辅助方法`reverse`进行局部反转。算法确保了当链表长度不是k的倍数时,剩余部分保持原样,且空间复杂度为O(1)。
摘要由CSDN通过智能技术生成