[链表专题]移除链表元素

描述

本题是力扣的203. 移除链表元素

考点

  • 链表的删除

题解

class Solution {
 public:
  ListNode* removeElements(ListNode* head, int val) {
   ListNode *dummyHead = new ListNode(-1, head), *cur = dummyHead;
   while(cur->next != nullptr){
    if(cur->next->val == val) cur->next = cur->next->next;
    else cur = cur->next;
   }
   return dummyHead->next;
  }
};

思路

单向链表中,当前节点无法知晓前一个节点的信息;如果增删改当前节点,上一个节点的next就得不到更新

所以每次操作的节点其实是当前节点的下一个

要保证操作的通用性,不用去判断操作头结点时的一些特殊情况;引入了dummyHead一个伪结点,它的next指向真正的头节点

(实际上,只要涉及到链表的操作,dummyHead几乎是必须的)

以序列{7, 4, 3, 7}为例,需要删除值为7的节点;从伪结点开始迭代

每次判断下一个节点的值是否满足题意;若是,则将当前节点的next指向下下个节点(将满足题意的节点从链表踢出)

若否,则指针移至下个节点,开启新一轮判断

由于核心问题就是「不同情况下修改节点的next值」,可以将其改造为递归

编写递归按照四部曲即可:

  1. 子问题:更新自己的next值,需要下一个节点的信息

  2. 递归语句顺序:递归方向分为一去一回,去方向至临界点后返回;本题应在回方向操作,因为要返回值给当前节点的上一个节点

    (当然也可以去方向操作,但那样和迭代无异,且无法处理头节点)

  3. 返回值:如果当前节点要被删除,则返回它的next值;否则返回自己(本质上是返回应该存在于链表内的节点)

    临界点返回nullptr值,代表nullptr一定存在于链表内

  4. 临界点:当前节点为nullptr

class Solution {
 public:
  ListNode* removeElements(ListNode* head, int val) {
   if(head == nullptr) return nullptr;
   head->next = removeElements(head->next, val);
   if(head->val == val) return head->next;
   return head;
  }
};

更多

恭喜你完成本题!

你可以选择继续下一题,或移步至仓库开始更多类型的挑战:https://fi3wey.github.io/

仓库内包含了更多经典案例的逻辑剖析与实现细节,助你在算法的学习之旅上一往无前!

看官若还满意,还请Star一下哟~

关注公众号峰狂算法,获取最新的刷题指导呀~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值