双向链表删除节点时间复杂度_青铜三人行——每周一题@删除链表的倒数第N个节点...

0b79d6323ada335d32b7a2fd5b9c636e.png

每周一题,代码无敌。这周,「青铜三人行」为你带来了一道关于“链表的题目”。

青铜三人行——每周一题@删除链表的倒数第N个节点_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​www.bilibili.com
2898e83b11826e0c46d039cc2ad8a822.png

删除链表的倒数第N个节点

给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。

示例:

给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.

说明:

给定的 n 保证是有效的。

进阶:

你能尝试使用一趟扫描实现吗?

力扣​leetcode-cn.com

啥是链表

要完成这道题,首先就得了解一下啥是链表?简单来说,链表是一种数据结构,它又一系列离散的节点组成。其特点是,每个节点上除了自己的数据以外,还会有一个或两个指针指向下一个或者上一个节点,使得这些节点可以起来。

其中,只有指向下一个节点的链表称为单向链表,它只能从前一个节点到下一个节点一个方向来查找其中的节点数据:

1cdba654102b3201582ffa594ea6ee35.png

双向链表则拥有两个指针,分别指向之前和之后的节点:

f709a7a93ec035015d3717415ed4a770.png

而在 JS 中,这道题目里给我们设定了链表的结构,很明显,是一个单向列表:

function 

解法一,两次遍历找到对应的节点:

了解了链表的数据结构以后,这道题就不难解决了。不过题目里有个小小的花招,即要求寻找「倒数第 n 个节点」。因为是单向链表,我们没法倒着寻找节点,因此我们很容易想到先找到整个链表的长度,计算出要找的元素的正向位置,然后再从头遍历,进行删除:

/**

解法二,转离散节点为连续节点

这道题数据量较小,因此运行的速度都比较快。于是向着题目中「只扫描一次」这个进阶目标前进。书香提出了一种方法,既然题目的难点在于链表不容易反向查找,那么把它映射成一个连续的数据结构不就可以解决了吗?于是很自然想到了应用数组,完成了题目:

/**

值的注意的是,当需要删除的元素是第一个元素的时候,容易造成数组的越界,需要特殊处理:

if

解法三,双指针法

上面书香的解法虽然在一次扫描中完成了任务,却额外引入了一个数组的外部结构。有没有更好的办法呢?Helen 和 曾大师对于这个问题,采用了新的办法:题目要求删除倒数第 n 个节点,那么我只需要在我当前扫描到的节点指针之后相隔 n 的节点再设置一个指针,到后一个指针越界的时候,当前节点就是需要删除的节点了:

483ce21ce5692afa7ec90a7dfd9669ec.png

代码如下:

var 

ertra

最后,曾大师 go 语言的福利时间又到啦,同样是双指针,你能看出有什么不同吗?

func 

而在时间和空间上,相当惊人 ,嗯嗯....

7f6c8ba775669f7836a8446e95faaa90.png

结尾

这周的题目相对来说比较简单,主要是说明了链表的数据结构。链表相对于数组来说,更容易插入、删除其中的节点,而数组比起来则更容易查找到某个节点(想想为什么?)。两个数据结构相辅相成,在不同的应用场景选择合适的数据结构,可以让你的程序运行起来事半功倍哦!这次的题目就这样了,欢迎通过bronze_3@163.com邮箱联系我们,下周见!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值