[python 刷题] 19 Remove Nth Node From End of List

[python 刷题] 19 Remove Nth Node From End of List

题目:

Given the head of a linked list, remove the nth node from the end of the list and return its head.

题目说的是就是移除倒数第 n 个结点,如官方给的案例:

这里提供的 n 就是 2,也就是倒数第二个结点

这道题本身的难度不是很大,最简单的方法就是 2-pass,第一个循环找到链表的长度,随后循环到 n - 2 的长度即可,这个解法代码如下:

python 复制代码
class Solution:
    def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:
        l, t = 0, head
        while t:
            l += 1
            t = t.next

        prev, next = head, head.next

        while l - n - 1 > 0 and next:
            prev = prev.next
            next = next.next
            n += 1

        if l == n:
            return head.next

        if not next:
            prev.next = None
            return head

        prev.next = next.next

        return head

这么处理一下,其实边界条件挺多的(主要是当 n = 0n = len(linked list) 这两个情况)

不过这道题有个 follow up:Could you do this in one pass?

也就是问一个循环能不能解决问题

这也是一个可以用双指针解决的方法,题目中说 nth from the emd,其实换个方式理解也可以理解成 nth from start:

这个时候的 fast 指向 3,slow 则是指向新建的 head,这里的差是 n + 1 是因为差第 n 个值是被移除的

这个时候 slowfast 同时进入循环,当 fast 指向空时,slow 也指向了 n - 1 个值:

代码如下:

python 复制代码
class Solution:
    def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:
        if not head:
            return head

        t = ListNode(0, head)

        slow, fast = t, head
        while n:
            fast = fast.next
            n -= 1

        while fast:
            slow = slow.next
            fast = fast.next

        slow.next = slow.next.next

        return t.next

这里取 n = 1 反而是因为代码实现起来会方便一些,否则就要使用 while n - 1:while fast.next: 结束循环:

python 复制代码
class Solution:
    def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:
        if not head:
            return head

        t = ListNode(0, head)

        slow, fast = t, head
        while n - 1:
            fast = fast.next
            n -= 1

        while fast.next:
            slow = slow.next
            fast = fast.next

        slow.next = slow.next.next

        return t.next

这两个代码从结果上来说是一样的

整体上来说,链表也好、二分搜索也好,这些 +1/-1 的边界条件其实就会影响代码会不会 AC

相关推荐
我命由我123452 分钟前
VSCode - VSCode 转换英文字母的大小写
开发语言·javascript·ide·vscode·编辑器·html·软件工具
zzc9217 分钟前
无线通信网络拓扑推理采样率实验(数据生成)
python·matlab·拓扑·无线通信网络拓扑推理·wcna·tpi
lilybaobei38 分钟前
Tensorflow安装出现dependency conflict错误
python·tensorflow
什么半岛铁盒42 分钟前
Linux中INADDR_ANY详解
开发语言·c++·算法
荣58242 分钟前
python打卡day29
python
m0_516484671 小时前
C#引用传递代码记录
开发语言·c#
mwicogito1 小时前
实验复现:应用 RIR 触发器的 TrojanRoom 后门攻击实现
人工智能·python·机器学习·语音识别·后门攻击
zh_xuan1 小时前
c++ std::function
开发语言·c++
hunzi_11 小时前
PHP商城源码:构建高效电商平台的利器
开发语言·php