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

题目描述:

 

 

 题解一(通过):

1.把输入链表中的数值依次读取到一个list nums中。

2.如果n!=1,构造一个val=nums[-1]的node1,如果n=1,则构造val=nums[-2]的node1。

3.从nums倒数第二个位置的数值开始,如果不是需要删除的节点,则构造node val=nums[i] next=node1 更新node1=node

需要注意的有:

1.如果原来链表里只有一个节点,直接返回None。

2.如果原来链表两个节点,判断n=1/n=2,直接返回另一个。

3.按照链表构造方法,先创建最后一个节点,但是在n=1的情况下,最后一个节点被删除,如果n=1,则最后一个节点val=nums[-2],但这种情况可能在之后的for循环中出现重复添加节点的情况,所以采用一个flag数组做记录。

class Solution(object):
    def removeNthFromEnd(self, head, n):
        nums = []
        while head!=None:
            nums.append(head.val)
            head = head.next
        if len(nums)<=1:
            return None
        if len(nums)==2:
            if n==1:
                return ListNode(nums[0])
            else:
                return ListNode(nums[1])
        flag = [0]*(len(nums))
        if n!=1:
            node1 = ListNode(nums[-1])
            flag[-1]=1
        else:
            node1 = ListNode(nums[-2])
            flag[-2]=1
        for i in range(len(nums)-2,-1,-1):
            if len(nums)-i!=n and flag[i]==0:
                node = ListNode(nums[i],next=node1)
                node1 = node
        return node

这个方法基本思想就是把链表中所有节点的val保存在nums,然后对除了nums[-n]的节点创建链表。但是提交的时候发现了很多问题,就在原本的基础上进行了修修补补,总体比较乱,方法二是对方法一实现方式的改进。

方法二(通过):

class Solution(object):
    def removeNthFromEnd(self, head, n):
        nums = []
        while head!=None:
            nums.append(head.val)
            head = head.next
        if len(nums)<=1:
            return None
        if len(nums)==2:
            if n==1:
                return ListNode(nums[0])
            else:
                return ListNode(nums[1])
        head = ListNode()
        ans = head
        for i in range(0,len(nums)):
            if len(nums)-i != n:
                node = ListNode(nums[i])
                head.next = node
        return ans.next

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值