LeetCode in Python 19. Remove Nth Node From End of List (删除链表的倒数第N个结点)

返回链表倒数第N个结点有两种方法,第一种方法是遍历两次链表,第一次遍历求链表长度,第二次遍历找到倒数第N个结点前一个结点,最后将该结点的next结点更换至next结点的next结点即可。第二种方法则只需要遍历一次链表,但需要设置两个指针,一前一后,指针间隔即为n,当后指针为None时说明已至链尾,此后修改前指针的next指向即可。本文推荐用解法二,但附上两种解法代码。

示例1:

图1  删除链表结点前后对比

方法一:

需遍历两次链表

class Solution:
    def removeNthFromEnd(self, head, n):
        dummy = ListNode(0, head)
        length = self.getLength(head)
        cur = dummy
        
        for i in range(length - n):
            cur = cur.next
        cur.next = cur.next.next
        return dummy.next
        
    def getLength(self, head):
        length = 0
        while head:
            length += 1
            head = head.next
        return length

方法二:

需要两个指针

class Solution:
    def removeNthFromEnd(self, head, n): 
        dummy = ListNode(0, head)
        dummy.next = head
        first = dummy
        second = dummy

        for i in range(n + 1):
            first = first.next
        
        while first:
            first = first.next
            second = second.next
        second.next = second.next.next
        return dummy.next

注意:

1)前后两个指针需要间隔n个结点:

        for i in range(n + 1):
                    first = first.next

        range(n)为一个半开半闭区间,故这里firsr指针要想先走n步需要range(n+1)

  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值