Leetcode203. 移除链表元素

题目描述

给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点

e.g.

 题解

对于链表类的题,由于头节点较难操作,我们可以在头节点前插入一个虚拟节点,这种头节点可以和中间节点以相同方式处理,便于操作

/**
 * 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 *dummyhead=new ListNode(0);
        dummyhead->next=head;
        ListNode* curr=dummyhead;
        while(curr->next!=nullptr)//遍历到倒数第二个即可
            if(curr->next->val==val)//把下一个的下一个给到下一个,然后把要删除的delete掉
            {
                ListNode* temp=curr->next;
                curr->next=curr->next->next;
                delete temp;
            }
            else//不需要删除时直接转到下一个
            {
                curr=curr->next;
            }
        head=dummyhead->next;//最后不要忘记把head结点给回虚拟节点的下一个
        delete dummyhead;//释放虚拟节点的内存
        return head;
    }
};

注意事项

1.处理链表学会善用虚拟节点,否则头节点难以处理

2.用C++删除节点时要善做“内存管理带师”,删除的结点要从内存中delete

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值