int pop() {
int value;
value = ptrf->data; // 1. 保存棧頂數據
// top = ptrf; // 2. 臨時保存待刪除節點(註釋掉了)
ptrf = ptrf->next; // 3. 棧頂指針後移
// delete top; // 4. 釋放原棧頂節點內存(註釋掉了)
return value;
}
Q: 「因為19行代碼說是NULL,那麼這裡的ptrf不就也為NULL了?」
A: 這裡有誤解。`ptrf = ptrf->next;` 是將 `ptrf` 指向下一個節點。只有當彈出的是最後一個節點時,`ptrf->next` 為 `NULL`,賦值後 `ptrf` 才變為 `NULL`(表示棧空)。這正是正確邏輯。
int pop() {
if (ptrf == nullptr) {
throw runtime_error("Stack underflow");
}
int value = ptrf->data;
ListNode* top = ptrf; // 保存當前棧頂節點地址
ptrf = ptrf->next; // 棧頂指針下移
delete top; // 釋放原棧頂節點內存,防止內存洩漏
if (ptrf == nullptr) { // 若彈出後棧空,尾指針也需置空
ptrb = nullptr;
}
return value;
}
彈出前: ptrf -> [Node1: data=10, next] -> [Node2: data=20, next] -> NULL
↑
top (待刪除)
彈出後: ptrf --------------------------> [Node2: data=20, next] -> NULL
(Node1內存已釋放)