Jelajahi Sumber

#feat:leetcode p876题题解

yangyi 2 minggu lalu
induk
melakukan
2e37ab2c14
2 mengubah file dengan 135 tambahan dan 0 penghapusan
  1. 74 0
      src/leetcode/p876/Solution.java
  2. 61 0
      src/leetcode/p876/SolutionTest.java

+ 74 - 0
src/leetcode/p876/Solution.java

@@ -0,0 +1,74 @@
+package leetcode.p876;
+
+import java.util.Objects;
+
+/**
+ * @ProjectName: LeetCode
+ * @FileName: Solution
+ * @Author: 杨逸
+ * @Data:2026/3/7 13:42
+ * @Description: https://leetcode.cn/problems/middle-of-the-linked-list/description/
+ * 876. 链表的中间结点
+ */
+public class Solution {
+    public ListNode middleNode(ListNode head) {
+        //快慢指针解法
+        //快指针速度为慢指针的两倍,当快指针到达链表末尾时,慢指针刚好到达链表中间
+        ListNode fast = head;
+        ListNode slow = head;
+        while(fast != null && fast.next != null){
+            fast = fast.next.next;
+            slow = slow.next;
+        }
+        return slow;
+    }
+
+    /**
+     * 统计节点个数的解法
+     * @param head
+     * @return {@code ListNode }
+     * @description:
+     * @author: 杨逸
+     * @data:2026/03/07 13:44:30
+     * @since 1.0.0
+     */
+    private ListNode countSolution(ListNode head){
+        if (head.next == null){
+            return head;
+        }
+        //统计节点个数
+        //根据节点个数,计算出第几个节点是中间节点
+        int count = 0;
+        ListNode temp = head;
+        while(temp != null){
+            count++;
+            temp = temp.next;
+        }
+        //查找中间节点
+        count = count/2;
+        for (int i = 0; i < count; i++) {
+            head = head.next;
+        }
+        return head;
+    }
+}
+class ListNode {
+    int val;
+    ListNode next;
+    ListNode() {}
+    ListNode(int val) { this.val = val; }
+    ListNode(int val, ListNode next) { this.val = val; this.next = next; }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        ListNode listNode = (ListNode) o;
+        return val == listNode.val;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(val, next);
+    }
+}

+ 61 - 0
src/leetcode/p876/SolutionTest.java

@@ -0,0 +1,61 @@
+package leetcode.p876;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * @ProjectName: LeetCode
+ * @FileName: SolutionTest
+ * @Author: 杨逸
+ * @Data:2026/3/7 14:07
+ * @Description:
+ */
+@RunWith(Parameterized.class)
+public class SolutionTest {
+    public static final Solution solution = new Solution();
+    private ListNode head;
+    private ListNode expected;
+
+    public SolutionTest(ListNode head, ListNode expected) {
+        this.head = head;
+        this.expected = expected;
+    }
+    @Parameterized.Parameters(name = "{index}: input={0}, expected={1}")
+    public static Collection<Object[]> data() {
+        ArrayList<Object[]> list = new ArrayList<>();
+        int[] data = new int[]{1,2,3,4,5};
+        int midVal = data[data.length / 2];
+
+        ListNode head  = createLink(data);
+        list.add(new Object[]{head, new ListNode(midVal)});
+
+        data = new int[]{1,2,3,4,5,6};
+        midVal = data[data.length / 2];
+        head = createLink(data);
+        list.add(new Object[]{head, new ListNode(midVal)});
+        return list;
+    }
+
+    private static ListNode createLink(int[] data) {
+        ListNode head = new ListNode(data[0]);
+        ListNode cur = head;
+        for (int i = 1; i < data.length; i++) {
+            ListNode node = new ListNode(data[i]);
+            cur.next = node;
+            cur = node;
+        }
+        return head;
+    }
+
+    @Test
+    public void middleNode() {
+        ListNode middleNode = solution.middleNode(head);
+        assertEquals(expected, middleNode);
+    }
+}