#移除链表元素

(学习内容来自《代码随想录》)

题目链接:力扣

方法一和方法二总的思路都是遍历链表,创建一个临时链表,使该临时链表的头节点地址等于原链表的头节点地址。利用临时链表遍历,判断当前链表指向的下一个链表值是否是目标值,如果是的话,那么就使当前链表的尾节点指向下一个链表的尾节点。如果不是,就更新当前链表,使当前链表指向当前链表的尾节点,继续遍历。最后,返回头节点地址即可。

##方法一:原链表移除元素

关键在于头节点和非头节点的处理。

如果是头节点,先判断头节点值是否是目标值,如果是的话,就一直往后遍历,更新头节点。同时,因为是c++编程,最好再释放一下不需要的内存。

如果是非头节点,就和一般的思路是一样的。

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)
                cur->next = cur->next->next;
            else 
                cur = cur->next;
        }
        return head;
    }
};

##方法二:使用虚拟头节点

创建一个虚拟链表,使该虚拟链表指向链表的尾节点。然后创造临时链表,使临时链表的值等于虚拟链表的头节点,利用临时链表依次遍历,之后的过程和一般思路是一样的。最后返回虚拟链表的尾节点就可以啦。

class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        ListNode* dummy = new ListNode(0);
        dummy->next = head;
        ListNode* cur = dummy;
        while (cur->next != NULL){
            ListNode* tmp = cur->next;
            if (cur->next->val == val){
                cur->next = cur->next->next;
                delete tmp;
            }
            else cur = cur->next;
        }
        return dummy->next;
    }
};

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值