题目描述
删除链表中等于给定值 val 的所有节点。
示例:
输入: 1->2->6->3->4->5->6, val = 6
输出: 1->2->3->4->5
题解
思路一 设置前置节点
设置一个哨兵当作前置节点,用来应对删除头节点的情况,依次遍历原来链表的每个节点,每当找到要删除的节点,让前一个节点指向该节点的后一个节点,使用一个指针删除该节点的内存空间。
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
ListNode* lamp = new ListNode(0);
lamp->next = head;
//设置哨兵,并连在头节点的前面//
ListNode* pre = lamp;
//保存当前节点的前一个节点//
ListNode* cur = head;
//当前节点//
ListNode* todelete = NULL;
//用于删除节点的内存空间//
while(cur != NULL){
todelete = NULL;
if(cur->val == val){
pre-> next = cur->next;
todelete = cur;
cur = cur->next;
delete todelete;
}
//删除节点//
else{
pre = cur;
cur = cur->next;
}
//不是要删除的节点,继续//
}
ListNode* p = lamp->next;
//获取新链表的头节点//
delete lamp;
//删除哨兵节点
return p;
}
};
思路二 递归
递归结束条件:到达尾节点 head == NULL
每到达一个节点,判断是否为删除节点:若是 return head->next;若不是 return head;
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
if(head != NULL)
head->next = removeElements(head->next,val);
//递归函数//
if(head == NULL) return NULL;
//递归结束条件//
else if(head->val == val) return head->next;
//删除节点
else return head;
//非目标节点
}
};