Leetcode题目:python实现删除链表的倒数第N个结点(双指针操作)

题目:删除链表的倒数第N个结点在这里插入图片描述

思路:
1.若链表为空,或者k<0, 则返回原链表。
2.两个指针p,q,先让指针p往前走n步,这样就保持p,q指针相差n个数。。
3.此时p与q一起各往前一步一步走,当p指向空时,q指向倒数第n个结点。

注意点:判断指针p的状态的临界点

  • 当p为None时,t<n,不用删除,返回原链表.
  • 当p为None时,t=n, 删除第一个结点。
  • 当p.next为空时,删除的时链表的中间结点。
"===============================题目解答=============================="      
def removeNthFromEnd(head: ListNode, n: int) -> ListNode:
    # 链表为空,或者n<0
    if not head or n <=0:
        return head
    # 2个移动的指针
    p = q = head
    # p指针先走n步,q指针再走,这样两个始终相差n步
    t = 0
    while p !=None and t < n:
        p = p.next
        t = t+1
        
    # 链表的长度小于n,不用删除,返回原链表
    if t < n:
        return head
    # 当n == 链表的长度时,即删除(倒数第n个节点==第1个节点)
    if p == None:
        return head.next

    # p指针走到末尾了,q指针就指向倒数第n个节点
    while p.next != None:
        p = p.next
        q = q.next
    tmp = q.next
    q.next = tmp.next
    return head
    
if __name__ == "__main__":
	# ListNode_handle的实现在《2个数相加》那篇文章,此处不再写
    aa = ListNode_handle()
    l1_lsit = [5,4,3,2,1]
    aa.add(l1_lsit)
    l1= aa.cur_node
    aa.print_ListNode(removeNthFromEnd(l1,2))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值