- 操作系統:ubuntu22.04
- IDE:Visual Studio Code
- 編程語言:C++11
算法描述
給定一個單向鏈表的頭節點 head 和一個特定值 val,要求編寫一個函數來刪除鏈表中所有值等于 val 的節點,并返回修改后的鏈表頭節點。
示例:
輸入: 1->2->6->3->4->5->6, val = 6
輸出: 1->2->3->4->5
解決方案
#include <iostream>struct ListNode
{int val;ListNode *next;ListNode(int x):val(x), next(nullptr){}
};void removeElements(ListNode* head, int val)
{while (head != nullptr && head->val == val){ListNode *tmp = head;head = head->next;delete tmp;}if(head ==nullptr){return;}ListNode *Cur = head;while(Cur->next != nullptr){if(Cur->next->val == val){ListNode* tmp = Cur->next;Cur->next = Cur->next->next;delete tmp;} else{Cur = Cur->next;} }
}void printList(ListNode *head)
{while(head != nullptr){std::cout << head->val;head = head->next;}
}
int main()
{ListNode *head = new ListNode(1);head->next = new ListNode(2);head->next->next = new ListNode(3);head->next->next->next = new ListNode(4);head->next->next->next->next = new ListNode(5);head->next->next->next->next->next = new ListNode(6);removeElements(head, 6);printList(head);
}
運行結果
12345
注意事項
- 處理頭節點:首先檢查并處理頭節點是否為要刪除的目標值,因為頭節點沒有前驅節點。
- 遍歷鏈表:對于每個節點,檢查其下一個節點的值是否為目標值。如果是,則跳過該節點(即改變當前節點的 next 指針指向下一個節點的下一個節點)。
- 內存管理:每次刪除節點時,記得釋放被刪除節點占用的內存,避免內存泄漏。