876. 链表的中间结点
问题
给定一个带有头结点
head
的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。
思路一
求链表的中间节点,统计链表长度length,中间节点位于length/2+1处
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode middleNode(ListNode head) {
if(head==null||head.next==null)
return head;
int length=0;
ListNode temp=head;
while(temp!=null)
{
length++;
temp=temp.next;
}
int mid=length/2+1;
for(int i=1;i<mid;i++)
head=head.next;
return head;
}
}
思路二
上面思路相当于遍历了两遍链表,可以设置两个引用,一个快引用,一个慢引用,快引用每次步长为2,慢引用步长为1,当快引用到达链表尾时,慢引用正好到达链表中间
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode middleNode(ListNode head) {
ListNode temp=head;
while(temp!=null&&temp.next!=null)
{
head=head.next;
temp=temp.next.next;
}
return head;
}
}