1. 程式人生 > 其它 >LeetCode-876:連結串列的中間結點

LeetCode-876:連結串列的中間結點

技術標籤:LeetCode

題目描述

876.連結串列的中間結點

給定一個頭結點為 head 的非空單鏈表,返回連結串列的中間結點
如果有兩個中間結點,則返回第二個中間結點

示例1:

輸入:[1,2,3,4,5]
輸出:此列表中的結點 3 (序列化形式:[3,4,5])

示例2:

輸入:[1,2,3,4,5,6]
輸出:此列表中的結點 4 (序列化形式:[4,5,6])

題解

要求連結串列的中間結點,我們可以使用快慢指標來求該題。定義一個慢指標slow,它每次往後走一個,再定義一個快指標fast,他每次往後走兩個,快慢指標同時走,當fast走到NULL或fast->next走到NULL的時候,slow剛好走到連結串列的中間位置。

初始情況:
在這裡插入圖片描述
①slow往後走一個,fast向後走兩個
在這裡插入圖片描述
②迴圈步驟①,直至fast == NULL 或 fast->next == NULL結束。
在這裡插入圖片描述

題解程式碼

struct ListNode* middleNode(struct ListNode* head){
    if(head==NULL || head->next==NULL)
    {
        return head;
    }
    else if(head->next->next==NULL)
    {
        return head->next;
    }
    else
{ //快慢指標 struct ListNode* slow = head; struct ListNode* fast = head; while(fast && fast->next != NULL) { slow = slow->next; //快指標一次走兩個 fast = fast->next->next; //當fast走兩個之後正好為NULL,則說明正好走到結束 if
(fast==NULL) break; } return slow; } }