19. 删除链表的倒数第 N 个结点

题目:

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

示例 1:

输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]

示例 2:

输入:head = [1], n = 1
输出:[]

示例 3:

输入:head = [1,2], n = 1
输出:[1]

提示:

  • 链表中结点的数目为 sz
  • 1 <= sz <= 30
  • 0 <= Node.val <= 100
  • 1 <= n <= sz

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

解题思路:

方法一:

通过遍历获得数组的长度,通过for循环找到倒数第n个指针,删除即可

代码:
# 通过遍历的方式找到倒数第n个结点 
class Solution:
    def removeNthFromEnd(self, head, n: int):
        p = head
        new_head= ListNode()
        new_head.next = head
        q = new_head
        length = 0
        while p:
            length+=1
            p = p.next
        p = head
        for i in range(length-n):
            p = p.next
            q = q.next
        q.next = p.next
        return new_head.next

方法二:

将指针进行反转,直接顺序查找要删除的指针,然后将删除后的指针数组重新反转

代码:
# 通过将指针反转也可以
def reverse(head):
    if not head or not head.next:
        return head
    new_head = reverse(head.next)
    head.next.next = head
    head.next = None
    return new_head

class Solution:
    def removeNthFromEnd(self, head, n: int):
        new_head = reverse(head)
        p = new_head
        List = ListNode()
        List.next = new_head
        q = List
        for i in range(n-1):
            p = p.next
            q = q.next
        q.next = p.next
        p.next = None
        head = reverse(List.next)
        return head

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值