题目:
给定一个带有头结点 head 的非空单链表,返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点。
示例 1:
输入:[1,2,3,4,5]
输出:此列表中的结点 3 (序列化形式:[3,4,5])
返回的结点值为 3 。 (测评系统对该结点序列化表述是 [3,4,5])。
注意,我们返回了一个 ListNode 类型的对象 ans,这样:
ans.val = 3, ans.next.val = 4, ans.next.next.val = 5, 以及 ans.next.next.next = NULL.
思路:
我们先获取到链表的总长度,然后在新建一个结点,使得这个节点指向链表的终结位置就可以了。
class Solution {
public ListNode middleNode(ListNode head) {
if (head == null) {
//如果链表为空
return null;
}
//获取链表的总长度
int len = size(head);
ListNode node = head;
for (int i = 0; i < len / 2; i++) {
node = node.next;
}
return node;
}
public int size(ListNode head) {
int size = 0;
for (ListNode node = head; node != null; node = node.next) {
size++;
}
return size;
}
}
我们发现当链表指向 len / 2位置的结点,不论这个链表长度是奇数还是偶数都满足题意。
结果如下图: