题解 | #牛群的重新分组#java
牛群的重新分组
https://www.nowcoder.com/practice/267c0deb9a6a41e4bdeb1b2addc64c93
import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* public ListNode(int val) {
* this.val = val;
* }
* }
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param head ListNode类
* @param k int整型
* @return ListNode类
*/
public ListNode reverseKGroup (ListNode head, int k) {
// write code here
if (head == null || k <= 1) {
return head;
}
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode prev = dummy;
ListNode curr = head;
while (true) {
ListNode groupHead = curr;
ListNode tail = getTail(curr, k);
if (tail == null) {
break;
}
ListNode nextGroupHead = tail.next;
tail.next = null;
reverse(groupHead);
prev.next = tail;
groupHead.next = nextGroupHead;
prev = groupHead;
curr = nextGroupHead;
}
return dummy.next;
}
/**
* 获取以head为头的链表的第k个节点(不包括head本身)。
*
* @param head 链表头节点
* @param k 第k个节点
* @return 第k个节点的引用
*/
private ListNode getTail(ListNode head, int k) {
for (int i = 1; i < k; i++) {
if (head == null) {
return null;
}
head = head.next;
}
return head;
}
/**
* 反转链表。
*
* @param head 链表头节点
*/
private void reverse(ListNode head) {
ListNode prev = null;
ListNode curr = head;
while (curr != null) {
ListNode next = curr.next;
curr.next = prev;
prev = curr;
curr = next;
}
}
}
代码考察的知识点:
- 单链表的遍历和基本操作。
- 反转链表和链表组的操作。
- 利用虚拟头节点简化链表操作。
代码解释
- 定义了一个
LinkedListReverser类,其中包含了一个名为reverseKGroup的方法,用于反转链表中每K个节点的组,保持原始链表顺序不变。 - 在
reverseKGroup方法中,首先判断链表是否为空或者组大小是否小于等于1,若是,则直接返回原链表。 - 创建虚拟头节点
dummy,指向链表的头部,并初始化前一个节点prev为虚拟头节点,当前节点curr为头节点。 - 使用
while循环遍历链表,通过调用getTail方法获取每个组的尾节点,并将组内节点进行反转。 - 更新虚拟头节点的
next指针,将组内反转后的头节点连接到上一个组的尾节点,同时将组内反转前的头节点连接到下一个组的头节点。 - 最后返回反转后的链表头部。
查看13道真题和解析