在單鏈表中刪除指定值的節點是基礎操作。本文提供完整的 C++ 實現,包含節點定義、鏈表創建、遍歷輸出、查找節點與刪除節點四大核心功能。
struct Node {
int pos; // 數據域
Node *pNext; // 指針域
Node(int position = -1, Node *next = nullptr)
: pos(position), pNext(next) {}
};
Node* CreateSingleList(int arr[], int n) {
Node *head = new Node; // 頭節點(不存數據)
Node *temp = head;
for (int i = 0; i < n; ++i) {
Node *createNode = new Node(arr[i]);
temp->pNext = createNode;
temp = createNode;
}
return head; // 返回頭節點
}
void Print(Node *head) {
while (head->pNext != nullptr) {
cout << head->pNext->pos << " ";
head = head->pNext;
}
cout << endl;
}
Node* FindNode(Node *head, int target) {
while (head->pNext != nullptr) {
if (head->pNext->pos == target) {
return head->pNext; // 返回目標節點指針
}
head = head->pNext;
}
return nullptr; // 未找到
}
void RemoveNode(Node *&head, int target) {
Node *pre = head; // 前驅節點
Node *curr = head->pNext; // 當前檢查節點
// 尋找目標節點及其前驅
while (curr != nullptr) {
if (curr->pos == target) break;
pre = curr;
curr = curr->pNext;
}
// 若找到,進行刪除鏈接
if (curr != nullptr) {
pre->pNext = curr->pNext; // 前驅跳過目標節點
curr->pNext = nullptr; // 斷開目標節點連接
delete curr; // 釋放內存(重要!)
}
}
int main() {
const int N = 10;
int arr[N];
for (int i = 0; i < N; ++i) arr[i] = i + 1; // 1~10
Node *head = CreateSingleList(arr, N);
Node *res = FindNode(head, 5);
cout << "Find node: " << res->pos << endl;
cout << "原鏈表: ";
Print(head);
RemoveNode(head, 1); // 刪除頭部節點
cout << "刪除 1 後: ";
Print(head);
// 記憶體釋放(簡略,實際應遍歷釋放所有節點)
return 0;
}
pre 與 curr 同步前進,找到目標時 pre 即為前驅。Node *&head 允許修改主調函數的頭指針(雖本例不涉及頭節點刪除,但屬良好習慣)。delete,避免內存洩漏。