如何將單鏈表中的最小值結點摘除
要從單鏈表中摘除最小值結點,我們可以採用以下算法:
- 首先,定義一個指針
p
指向單鏈表的頭結點。 - 設置一個變量
min_val
來存儲單鏈表中的最小值。 - 初始化
min_val
為p
所指向的結點的值。 - 設置一個指針
q
指向p
的後續結點。 - 當
q
未指向單鏈表的尾結點時,執行以下操作:- 如果
q
所指向的結點的值小於min_val
,則更新min_val
。 - 然後,將
q
指向q
的後續結點。
- 如果
- 如果
min_val
不是單鏈表的頭結點,則將min_val
的前一個結點的後續指針指向min_val
的後續結點,並將min_val
的後續指針置為NULL
。 - 返回
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),因為它只使用了常數級別的額外空間。