LeetCode 链表的中间结点

LeetCode 链表的中间结点_第1张图片

方法一(数结点):

立马想到的
先计算出有多少个结点,然后数到中间结点位置返回

	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 A = {head};
        while (nullptr != A.back()->next)
            A.push_back(A.back()->next);
        return A[A.size() / 2];
    }

你可能感兴趣的:(LeetCode,链表,leetcode,数据结构)