class Solution {
public ListNode reverseKGroup(ListNode head, int k) {
// 如果k为1,或head为空指针,或head.next为空指针,返回head
if (k == 1 || head == null || head.next == null) {
return head;
}
// 求第k个节点
ListNode p = head;
for (int i = 1; i < k; i++) {
p = p.next;
if (p == null) {
return head;
}
}
// 继续翻转右部分
ListNode rightPart = reverseKGroup(p.next, k);
// 第k个节点指向null
p.next = null;
// 翻转左部分
ListNode leftPart = reverse(head);
// 尾节点指向右部分
head.next = rightPart;
// 返回新头节点
return leftPart;
}
private ListNode reverse(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode root = new ListNode();
while (head != null) {
ListNode tmp = head.next;
head.next = root.next;
root.next = head;
head = tmp;
}
return root.next;
}
}
25. K 个一组翻转链表
最新推荐文章于 2024-10-16 00:00:43 发布