方法一:遍历两边链表,第一遍统计结点个数,第二遍在中点结点停下,返回指针。
ListNode* middleNode(ListNode* head) {
int n = 0,i = 0;
ListNode *p = head;
while(p != NULL)
{
n++;
p = p->next;
}
n = n/2 + 1;
p = head;
while(p != NULL)
{
i++;
if(i == n)
break;
p = p->next;
}
return p;
}
方法二:快慢指针法,用两个指针来遍历链表,快指针一次走两个节点,慢指针一次走一个,当快指针走到结尾时,慢指针停留的位置必然是中间结点。
ListNode* middleNode(ListNode* head) {
ListNode *p1 = head,*p2 = head;
while(p1 != NULL && p2 != NULL)
{
p2 = p2->next;
if(p2 != NULL)
p2 = p2->next;
else break;
p1 = p1->next;
}
return p1;
}