6.27 Kgroup 链表 +二刷链表

This commit is contained in:
zhangsan 2025-06-27 10:02:57 +08:00
parent 9e0b5945a2
commit 76f15247d7
3 changed files with 60 additions and 1 deletions

View File

@ -10,6 +10,7 @@ package linkedlist;
* 链接https://leetcode.cn/problems/reverse-linked-list-ii/ * 链接https://leetcode.cn/problems/reverse-linked-list-ii/
*/ */
//不会一次遍历来翻转 //不会一次遍历来翻转
//二刷不会
public class ReverseBetween { public class ReverseBetween {
private void reverseLinkedList(ListNode head) { private void reverseLinkedList(ListNode head) {
// 也可以使用递归反转一个链表 // 也可以使用递归反转一个链表
@ -92,4 +93,5 @@ public class ReverseBetween {
// 5. 返回新的链表头 // 5. 返回新的链表头
return dummyNode.next; return dummyNode.next;
} }
} }

View File

@ -10,4 +10,44 @@ package linkedlist;
* 链接https://leetcode.cn/problems/remove-duplicates-from-sorted-list-ii/ * 链接https://leetcode.cn/problems/remove-duplicates-from-sorted-list-ii/
*/ */
public class ReverseKGroup { public class ReverseKGroup {
// 反转 [head, tail] 这一段返回新的头和新的尾
private ListNode[] reverse(ListNode head, ListNode tail) {
ListNode prev = tail.next;
ListNode p = head;
while (prev != tail) {
ListNode nxt = p.next;
p.next = prev;
prev = p;
p = nxt;
}
// 反转后tail 变成新头head 变成新尾
return new ListNode[]{ tail, head };
}
public ListNode reverseKGroup(ListNode head, int k) {
ListNode dummy = new ListNode(-1);
dummy.next = head; // 关键 dummy.next 指向原始 head
ListNode pre = dummy;
while (true) {
// 检查剩余是否至少有 k 个节点
ListNode tail = pre;
for (int i = 0; i < k; i++) {
tail = tail.next;
if (tail == null) {
// 不足 k 直接返回
return dummy.next;
}
}
ListNode nextGroupHead = tail.next;
// 反转 pre.next ... tail 这一段
ListNode[] reversed = reverse(pre.next, tail);
// 接上前半段pre reversedHead
pre.next = reversed[0];
// reversedTail nextGroupHead
reversed[1].next = nextGroupHead;
// 移动 pre 到这一段反转后的尾部为下一轮做准备
pre = reversed[1];
}
}
} }

View File

@ -8,7 +8,8 @@ package linkedlist;
*/ */
//需重做 //需重做
public class SwapPairs { //二刷会做
public class SwapPairs {
//只有一个节点或没有节点时无需交换 //只有一个节点或没有节点时无需交换
//递归 //递归
public ListNode swapPairs(ListNode head) { public ListNode swapPairs(ListNode head) {
@ -38,4 +39,20 @@ public class SwapPairs {
} }
return dummyHead.next; return dummyHead.next;
} }
public ListNode swapPairs2(ListNode head) {
if(head==null || head.next==null) return head;
ListNode dummyNode=new ListNode(-1);
ListNode pre=dummyNode,cur=head,next=head.next;
while (next!=null){
cur.next=next.next;
next.next=cur;
pre.next=next;
pre=cur;
cur=pre.next;
if(cur==null)break;
else next=cur.next;
}
return dummyNode.next;
}
} }