给你一个链表的头节点 head
和一个整数 val
,请你删除链表中所有满足 Node.val == val
的节点,并返回 新的头节点 。
示例 1:
输入:head = [1,2,6,3,4,5,6], val = 6 输出:[1,2,3,4,5]
示例 2:
输入:head = [], val = 1 输出:[]
示例 3:
输入:head = [7,7,7,7], val = 7 输出:[]
这里我使用到哑指针用于保存head的地址,这里cur表示当前遍历到的结点,分三种情况
第一种 cur的后两个节点都存在并且后一个元素要移除(相当于示例1中的第1个6),只要cur->next = cur->next->next;
第二种,cur是倒数第二个元素并且最后一个元素要移除(相当于示例1中的第二个6),只要让cur的next指针指向空就可以了
第三种,cur后一个元素不需要移除,就把cur后移一位。
ListNode* removeElements(ListNode* head, int val) {
ListNode* dummy = new ListNode(0, head);
ListNode* cur = dummy;
while (cur->next) {
if (cur->next->val == val && cur->next->next)
cur->next = cur->next->next;
else if (cur->next->val == val)
cur->next = NULL;
else
cur = cur->next;
}
return dummy->next;
}
递归做法
ListNode* removeElements(ListNode* head, int val) {
if (head == NULL)
return head;
head->next = removeElements(head->next, val);
if (head->val == val)
return head->next;
else
return head;
}