6.27 Kgroup 链表 +二刷链表
This commit is contained in:
parent
9e0b5945a2
commit
76f15247d7
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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];
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user