链表--part 2--移除链表元素(leetcode 203)

基础思想

值得分类的实际上就是需要判断是头节点进行删除还是中间的节点进行删除。

  1. 头节点进行删除:
    实际上就是修改头节点的位置,然后释放对应节点的空间。
  2. 中间节点进行删除:
    实际上就是使用双指针法,前指针用于删除,后指针后于判断数据。

leetcode 203 移除链表元素

链接

class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        ListNode* p = head;
        //先判断头节点是不是对应的val,因为头节点的删除和其他的不太一样
        //对于头节点的删除其实只需要将head = 下一个就相当于删除了
        while(p)
        {
            if(p->val == val)
            {
                head = p->next;
                delete p;
                p = head;
            }
            else
                break;
        }
        //然后删除非头节点对应的val 使用双指针法进行删除。
        //此时注意p已经检测过了。
        ListNode* q = p;
        while(q)
        {
            if(q && q->val == val)
            {
                p->next = q->next;
                delete q;
                q = p->next;
            }
            else
            {
                p = q;
                q = q->next;
            }
        }
        return head;
    }
};

分析不足

分析一下这一题,实际上是由于头节点的前面并不存在前一个节点导致头节点操作和其他的执行不相同,那我们便引申出一个虚拟头节点的定义。使用虚拟头节点后,此题就不需要进行分类了。

class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        ListNode* dummyHead = new ListNode(0); // 设置一个虚拟头结点
        dummyHead->next = head; // 将虚拟头结点指向head,这样方面后面做删除操作
        ListNode* cur = dummyHead;
        while (cur->next != NULL) {
            if(cur->next->val == val) {
                ListNode* tmp = cur->next;
                cur->next = cur->next->next;
                delete tmp;
            } else {
                cur = cur->next;
            }
        }
        head = dummyHead->next;
        delete dummyHead;
        return head;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值