编写语言:java
题目描述:
给你单链表的头结点 head ,请你找出并返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点。
(图片来自leetcode)思路1分析:先遍历找到整个链表的长度,然后计算中间结点的位置,再遍历寻找即可
时间复杂度O(2n)
思路1代码:
public ListNode middleNode(ListNode head) {
ListNode p=head;
ListNode q=head;
int len=1;
while(p!=null)
{
//先遍历找到链表长度
len++;
p=p.next;
}
//找到中间的长度
int re=0;
if(len%2==0)
{
re=len/2;
}
else{
re=(len+1)/2;
}
//从头开始移动指针
for(int i=1;i<re;i++)
{
q=q.next;
}
return q;
}
思路2分析:(来自labuladong)
利用快慢指针fast和slow,其中快指针fast移动两步、慢指针就移动一步;也即快指针是慢指针移动的两倍,这样,当fast走到末尾的时候,slow就指到了中间节点;
时间复杂度是O(n)
public ListNode middleNode(ListNode head) {
ListNode slow=head,fast=head;
//因为fast一次性要移动两个位置,所以需要保证fast和fast.next不为空
while(fast!=null&&fast.next!=null)
{
fast=fast.next;
fast=fast.next;
slow=slow.next;
}
return slow;
}