LeetCode - 203 - 移除链表元素(remove-linked-list-elements)

Create by jsliang on 2019-07-09 19:01:37
Recently revised in 2019-07-09 19:52:55

一 目录

不折腾的前端,和咸鱼有什么区别

| 目录 | | --- | | 一 目录 | | 二 前言 | | 三 解题 | |  3.1 解法 - 正常解法 | |  3.2 解法 - 递归 |

二 前言

  • 难度:简单

  • 涉及知识:链表

  • 题目地址:https://leetcode-cn.com/problems/remove-linked-list-elements/

  • 题目内容

删除链表中等于给定值 val 的所有节点。	
示例:	
输入: 1->2->6->3->4->5->6, val = 6	
输出: 1->2->3->4->5

三 解题

小伙伴可以先自己在本地尝试解题,再回来看看 jsliang 的解题思路。

3.1 解法 - 正常解法

  • 解题代码

var removeElements = function(head, val) {	
  let result = {	
    val: -99,	
    next: head,	
  };	
  let chase = result;	
  while(chase.next) {	
    if (chase.next.val === val) {	
      chase.next = chase.next.next;	
    } else {	
      chase = chase.next;	
    }	
  }	
  return result.next;	
};
  • 执行测试

head

let head = {	
  val: 1, next: {	
    val: 2, next: {	
      val: 6, next: {	
        val: 3, next: {	
          val: 4, next: {	
            val: 5, next: {	
              val: 6, next: null,	
            },	
          },	
        },	
      },	
    },	
  },	
};

return

let head = {	
  val: 1, next: {	
    val: 2, next: {	
      val: 3, next: {	
        val: 4, next: {	
          val: 5, next: null	
        },	
      },	
    },	
  },	
};
  • LeetCode Submit

✔ Accepted	
  ✔ 65/65 cases passed (104 ms)	
  ✔ Your runtime beats 90.76 % of javascript submissions	
  ✔ Your memory usage beats 24.79 % of javascript submissions (37.5 MB)
  • 解题思路

虽然链表做过几次,但是感觉印象不深。

在前面的 LeetCode 题目中,我们做过几次链表,但是因为过久没接触,感觉又有些淡忘了,现在刚好重新复习。

首先,我们需要了解下链表的结构:

let head = {	
  val: 1, next: {	
    val: 2, next: {	
      val: 6, next: {	
        val: 3, next: {	
          val: 4, next: {	
            val: 5, next: {	
              val: 6, next: null,	
            },	
          },	
        },	
      },	
    },	
  },	
};

小伙伴们可以发现,相对于 来说,链表 比较简单一点,一个 val 显示当前的值,一个 next指向下一个节点。

然后,我们要如何将其中的 6 节点去掉呢?

var removeElements = function(head, val) {	
  let result = {	
    val: -99,	
    next: head,	
  };	
  let chase = result;	
  while(chase.next) {	
    if (chase.next.val === val) {	
      chase.next = chase.next.next;	
    } else {	
      chase = chase.next;	
    }	
  }	
  return result.next;	
};
  1. 新建一个 result 节点,用来获取最终的节点。因为我们不能直接引用 head(非址引用),所以我们创造一个,最后只需要指向它的 next,即可返回正确的链表。

  2. 新建一个 chase 追逐者节点,用来追逐 head 的推进。

  3. 我们在循环中判断,这个追逐节点的下一个节点的值,是否是需要去掉的值。如果是,我们则指向下下一层;如果不是,我们则指向下一层。

  4. 直到 chase 没有下一层(即 next 为 null)后,我们返回最终结果。

最后,完成了本题的题解。

3.2 解法 - 递归

  • 解题代码

var removeElements = function(head, val) {	
  if (!head) {	
    return null;	
  }	
  head.next = removeElements(head.next, val);	
  if (head.val === val) {	
    return head.next;	
  } else {	
    return head;	
  }	
};
  • 执行测试

✔ Accepted	
  ✔ 65/65 cases passed (104 ms)	
  ✔ Your runtime beats 90.76 % of javascript submissions	
  ✔ Your memory usage beats 24.79 % of javascript submissions (37.5 MB)
  • LeetCode Submit

✔ Accepted	
  ✔ 65/65 cases passed (120 ms)	
  ✔ Your runtime beats 66.03 % of javascript submissions	
  ✔ Your memory usage beats 5.13 % of javascript submissions (38.2 MB)
  • 解题思路

光明正大的偷懒。


不折腾的前端,和咸鱼有什么区别!

640?wx_fmt=jpeg

jsliang 会每天更新一道 LeetCode 题解,从而帮助小伙伴们夯实原生 JS 基础,了解与学习算法与数据结构。

扫描上方二维码,关注 jsliang 的公众号,让我们一起折腾!

640?wx_fmt=png

jsliang 的文档库 由 梁峻荣 采用 知识共享 署名-非商业性使用-相同方式共享 4.0 国际 许可协议进行许可。
基于https://github.com/LiangJunrong/document-library上的作品创作。
本许可协议授权之外的使用权限可以从 https://creativecommons.org/licenses/by-nc-sa/2.5/cn/ 处获得。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值