diff --git a/src/main/java/linkedlist/ReverseBetween.java b/src/main/java/linkedlist/ReverseBetween.java index 6e67f24..9e86470 100644 --- a/src/main/java/linkedlist/ReverseBetween.java +++ b/src/main/java/linkedlist/ReverseBetween.java @@ -10,6 +10,7 @@ package linkedlist; * 链接:https://leetcode.cn/problems/reverse-linked-list-ii/ */ //不会一次遍历来翻转 +//二刷不会 public class ReverseBetween { private void reverseLinkedList(ListNode head) { // 也可以使用递归反转一个链表 @@ -92,4 +93,5 @@ public class ReverseBetween { // 5. 返回新的链表头 return dummyNode.next; } + } diff --git a/src/main/java/linkedlist/ReverseKGroup.java b/src/main/java/linkedlist/ReverseKGroup.java index c34adbe..5f657f9 100644 --- a/src/main/java/linkedlist/ReverseKGroup.java +++ b/src/main/java/linkedlist/ReverseKGroup.java @@ -10,4 +10,44 @@ package linkedlist; * 链接:https://leetcode.cn/problems/remove-duplicates-from-sorted-list-ii/ */ 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]; + } + } } diff --git a/src/main/java/linkedlist/SwapPairs.java b/src/main/java/linkedlist/SwapPairs.java index 863ef35..31be1c2 100644 --- a/src/main/java/linkedlist/SwapPairs.java +++ b/src/main/java/linkedlist/SwapPairs.java @@ -8,7 +8,8 @@ package linkedlist; */ //需重做 -public class SwapPairs { +//二刷会做 + public class SwapPairs { //只有一个节点或没有节点时无需交换! //递归 public ListNode swapPairs(ListNode head) { @@ -38,4 +39,20 @@ public class SwapPairs { } 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; + } }