203. 移除链表元素
思路:首先要考虑吧有两种情况,一种是头节点就是要删除的节点,需要单独处理,因为链表的删除操作是通过前一个节点来移除当前节点,但头节点没有前一个节点。
方法一:单独处理头节点的情况。处理完头节点再处理后面节点。
代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
while(head != NULL && head->val == val){
ListNode* tmp = head; //处理头节点是被删除节点的操作
head = head->next;
delete tmp; //手动清理
}
//删除不是头节点的节点
ListNode* cur = head;
while(cur != NULL && cur->next != NULL){
//当链表不为空也不为最后一个元素的时候
if(cur->next->val == val){
ListNode* tmp = cur->next; //保留tmp是为了手动清除
cur->next = cur->next->next;
delete tmp;
}
else{
cur = cur->next;
}
}
return head;
}
};
方法二:通过创建虚拟头节点,来统一处理链表。
代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
ListNode* tmpHead = new ListNode(0); //创建虚拟头节点
tmpHead->next = head; //将现有链表的头节点接到虚拟头节点后面
ListNode* cur=tmpHead;
while(cur != NULL && cur->next != NULL){
if(cur->next->val == val){
ListNode* tmp = cur->next; //创建临时节点为了存储要清除的节点,以便清理内存
cur->next = cur->next->next;
delete tmp; //手动清理
}
else{
cur = cur->next;
}
}
head = tmpHead->next; //最后删除掉虚拟头节点
delete tmpHead;
return head;
}
};