【算法】【线性表】【链表】链表的中间结点
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; } }
算法本身也是一种磨练,想不到好的方法没关系,学到了学以致用也是一种好的态度,加油。