[LC]876题 Middle of the Linked List (链表的中间结点)(链表)

时间:2019-09-29
本文章向大家介绍[LC]876题 Middle of the Linked List (链表的中间结点)(链表),主要包括[LC]876题 Middle of the Linked List (链表的中间结点)(链表)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

①中文题目

给定一个带有头结点 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.
示例 2:

输入:[1,2,3,4,5,6]
输出:此列表中的结点 4 (序列化形式:[4,5,6])
由于该列表有两个中间结点,值分别为 3 和 4,我们返回第二个结点。
 

提示:

给定链表的结点数介于 1 和 100 之间。

②思路

  首先需要寻找链表的长度,遍历链表。用小写i去记录长度。然后用j去遍历,直到j=i/2的时候,就遍历到了链表的中点处,输出。

③代码

 1 class Solution {
 2     public ListNode middleNode(ListNode head) {
 3         if(head==null||head.next==null)
 4             return head;
 5         int i=1;
 6         ListNode temp1=head;    //temp1用于遍历找到链表的长度
 7         ListNode temp2=head;    //temp2用于遍历找到链表的中点
 8        while(temp1.next!=null){
 9            temp1=temp1.next;
10            i+=1;
11        }
12            
13        for(int j=0;j<i/2;j++){
14            temp2=temp2.next;   
15        }
16     return temp2;   
17     }
18 }

④运行结果

执行结果:通过
执行用时 :0 ms, 在所有 Java 提交中击败了100.00%的用户
内存消耗 :33.8 MB, 在所有 Java 提交中击败了67.47%的用户

⑤学到的知识 

    1、期待java有个能够直接得到链表长度的库函数。

    2、我有个改进的想法,在第一次寻找数组长度的时候,就开始寻找中点,具体思想是,小写i不是每增加1次,temp1就向后移动1位嘛,那么我想让小写i每增加两次,让temp2向后移动1次,当i成为链表长度时,我的temp2也就找到了链表的中点。

         我这种改进的思路是在于,我觉得,在上述原始代码里,第一次遍历,居然只用来找链表长度这一件事,这太浪费资源了。

原文地址:https://www.cnblogs.com/zf007/p/11607368.html