方法一(数结点):
立马想到的
先计算出有多少个结点,然后数到中间结点位置返回
ListNode* middleNode(ListNode* head) {
ListNode *headTmp = head;
int iTotal = 0;
while(nullptr != head)
{
++iTotal;
head = head->next;
}
int iIndex = 0;
while(iIndex < iTotal / 2)
{
++iIndex;
headTmp = headTmp->next;
}
return headTmp;
}
方法二(快慢指针):
大步小步问题(想起了小时候数学中的套圈问题,此情此景是如此的相似)
大步一次走2,小步一次走1
大步肯定比小步先到,到达后小步正好在中间结点位置
ListNode* middleNode(ListNode* head) {
ListNode *fast = head;
ListNode *slow = head;
while(nullptr != fast && nullptr != fast->next )
{
fast = fast->next->next;
slow = slow->next;
}
return slow;
}
方法三(数组):
应该算数结点的变种
ListNode* middleNode(ListNode* head) {
vector<ListNode*> A = {head};
while (nullptr != A.back()->next)
A.push_back(A.back()->next);
return A[A.size() / 2];
}