【算法】【线性表】【链表】链表的中间结点

1  题目

给你单链表的头结点 head ,请你找出并返回链表的中间结点。

如果有两个中间结点,则返回第二个中间结点。

示例 1:

输入:head = [1,2,3,4,5]
输出:[3,4,5]
解释:链表只有一个中间结点,值为 3 。

示例 2:

输入:head = [1,2,3,4,5,6]
输出:[4,5,6]
解释:该链表有两个中间结点,值分别为 3 和 4 ,返回第二个结点。

提示:

  • 链表的结点数范围是 [1, 100]
  • 1 <= Node.val <= 100

2  解答

当我不知道快慢指针的时候,我就是计数法,也就是两次遍历得出的:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode middleNode(ListNode head) {
        // 参数边界校验
        if (head == null || head.next == null) {
            return head;
        }
        int total = 0;
        ListNode node = head;
        while (node != null) {
            total++;
            node = node.next;
        }

        int middle = total / 2;
        node = head;
        while (middle > 0) {
            node = node.next;
            middle--;
        }
        return node;
    }
}

这是快慢指针的:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode middleNode(ListNode head) {
        // 参数边界校验
        if (head == null || head.next == null) {
            return head;
        }
        ListNode quickNode = head;
        ListNode slowNode = head;
        while (quickNode != null && quickNode.next != null) {
            quickNode = quickNode.next.next;
            slowNode = slowNode.next;
        }
        return slowNode;
    }
}

算法本身也是一种磨练,想不到好的方法没关系,学到了学以致用也是一种好的态度,加油。

posted @ 2024-01-18 07:28  酷酷-  阅读(8)  评论(0编辑  收藏  举报