①中文题目
给定一个带有头结点 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也就找到了链表的中点。
我这种改进的思路是在于,我觉得,在上述原始代码里,第一次遍历,居然只用来找链表长度这一件事,这太浪费资源了。