方法一:遍歷兩邊鏈表,第一遍統計結點個數,第二遍在中點結點停下,返回指針。
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;
}