如何將單鏈表中的最小值結點摘除

要從單鏈表中摘除最小值結點,我們可以採用以下算法:

  1. 首先,定義一個指針 p 指向單鏈表的頭結點。
  2. 設置一個變量 min_val 來存儲單鏈表中的最小值。
  3. 初始化 min_valp 所指向的結點的值。
  4. 設置一個指針 q 指向 p 的後續結點。
  5. q 未指向單鏈表的尾結點時,執行以下操作:
    • 如果 q 所指向的結點的值小於 min_val,則更新 min_val
    • 然後,將 q 指向 q 的後續結點。
  6. 如果 min_val 不是單鏈表的頭結點,則將 min_val 的前一個結點的後續指針指向 min_val 的後續結點,並將 min_val 的後續指針置為 NULL
  7. 返回 min_val 的值。

以下是一個C語言的實現示例:

struct ListNode {
    int val;
    struct ListNode *next;
};

struct ListNode *DeleteMin(struct ListNode *head) {
    struct ListNode *min_node = head, *prev = NULL;
    int min_val = INT_MAX;

    while (min_node != NULL) {
        if (min_node->val < min_val) {
            min_val = min_node->val;
            prev = min_node;
        }
        min_node = min_node->next;
    }

    if (min_val != INT_MAX) {
        if (prev == NULL) {
            head = head->next;
        } else {
            prev->next = min_node->next;
        }
        min_node->next = NULL;
    }

    return min_val;
}

這個算法的時間複雜度為O(n),空間複雜度為O(1),因為它只使用了常數級別的額外空間。