1. 程式人生 > 其它 >【力扣 095】2095. 刪除連結串列的中間節點

【力扣 095】2095. 刪除連結串列的中間節點

2095. 刪除連結串列的中間節點

給你一個連結串列的頭節點 head 。刪除 連結串列的 中間節點 ,並返回修改後的連結串列的頭節點 head 。

長度為 n 連結串列的中間節點是從頭數起第 ⌊n / 2⌋ 個節點(下標從 0 開始),其中 ⌊x⌋ 表示小於或等於 x 的最大整數。

對於 n = 1、2、3、4 和 5 的情況,中間節點的下標分別是 0、1、1、2 和 2 。
 

示例 1:

輸入:head = [1,3,4,7,1,2,6]
輸出:[1,3,4,1,2,6]
解釋:
上圖表示給出的連結串列。節點的下標分別標註在每個節點的下方。
由於 n = 7 ,值為 7 的節點 3 是中間節點,用紅色標註。
返回結果為移除節點後的新連結串列。 
示例 2:

輸入:head = [1,2,3,4]
輸出:[1,2,4]
解釋:
上圖表示給出的連結串列。
對於 n = 4 ,值為 3 的節點 2 是中間節點,用紅色標註。
示例 3:

輸入:head = [2,1]
輸出:[2]
解釋:
上圖表示給出的連結串列。
對於 n = 2 ,值為 1 的節點 1 是中間節點,用紅色標註。
值為 2 的節點 0 是移除節點 1 後剩下的唯一一個節點。

來源:力扣(LeetCode)
連結:https://leetcode.cn/problems/delete-the-middle-node-of-a-linked-list
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

程式碼實現:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* deleteMiddle(ListNode* head) 
    {
        if(!head) return head;
        if(!head->next) return head->next;
        ListNode *pre, *slow, *fast;
        pre = slow = fast = head;
        while(fast && fast->next)
        {
            fast = fast->next->next;
            pre = slow;
            slow = slow->next;
        }
        pre->next = pre->next->next;
        return head;
    }
};