Leetcode.19.删除链表的倒数第n个节点.python

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

自己解法(长度)

  1. 首先获取链表长度l
  2. 寻找链表长度l与倒数第n个节点中n的关系;
  3. index=l-n;
  4. 删除index位置节点即可

细节:

  1. 长度为0的时候直接返回head(空链表);
  2. index=0的时候,相当于删除头节点。
class Solution(object):
    def length(self,head):
        cur=head
        count=0
        while cur:
            count+=1
            cur=cur.next
        return count

    def removeNthFromEnd(self, head, n):
        l=self.length(head)
        if l==1:
            return None
        index=l-n
        if index==0:
            return head.next
        prev=head
        for _ in range(index-1):
            prev=prev.next
        prev.next=prev.next.next
        return head

“先进后出”
弹出栈的第 n个节点就是需要删除的节点,且当前栈顶的节点就是该删除节点的前驱节点。

class Solution(object):
    def removeNthFromEnd(self, head, n):
        cur = head
        stack=list()
        while cur:
            stack.append(cur)
            cur=cur.next
        
        for i in range(n):
            stack.pop()
            #已经删除n个元素,目前stack的最后一个元素就是待删除节点的前一个节点
        if stack==[]:
            return head.next
        prev=stack[-1]
        prev.next=prev.next.next
        return head

注意:为什么题解中令dummy=ListNode(0,head)就不用考虑特殊情况呢?何时应该使用呢?
哑节点:完美解决一旦头结点被删除无法返回元素的问题。

双指针法

  1. 快慢指针从头节点出发
  2. 快指针先行n步;
  3. 快指针到达末尾,慢指针到达n
class Solution(object):
    def removeNthFromEnd(self, head, n):
        dummy=ListNode(0,head)
        slow,fast=dummy,head
        for _ in range(n):
            fast=fast.next
        while fast:
            fast=fast.next
            slow=slow.next
        slow.next=slow.next.next
        return dummy.next
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值