双指针题的一次写法优化

题目

有一个单链表,删除它的倒数第n个节点,尽量只要遍历一次。(保证N是有效值)

思路:

这题的从出题人和我们的想法中,最自然的方法就是用到双指针。快慢两指针,同时指着head,然后快指针先走N步,然后当走到快指针走到None的时候,慢指针走到了倒数第N个节点,刚好可以用来处理。

我的代码:

确定思路后,我便开始着手写代码。思路之外,要考虑几点:

1、快指针先走N步的实现方式;

2、慢指针到了倒数第N个,删除它需要一个previous节点,所以要提前写好这个previous;

3、如果是倒数第n个,n是链表的长度,则写法有需要有所变化。

def delpost(linka,n):
    fast=slow=linka.head

    times=0
    previous=None
    while times!=n:
        times+=1
        fast=fast.next

    while fast!=None:
        fast=fast.next
        previous=slow
        slow=slow.next

    if previous==None:
        linka.head=slow.next
    else:
        previous.next=slow.next

    return linka.head

写完后,我就觉得写的真的是太不简洁了,两个while,一个if else,以及还有times previous这些额外的变量。感觉实现的较为拖沓。

优化

class Solution:
    def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
        Node = ListNode(None)
        Node.next = head
        first,slow = Node,Node
        for i in range(n):
            first = first.next
        while first.next != None:
            first = first.next
            slow = slow.next
        slow.next = slow.next.next
        return Node.next

作者:HUST_PDE_YCX
链接:https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/solution/python3-shuang-zhi-zhen-20you-hua-ban-by-huster201/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

这是在力扣上看到的,类似于一个优化版简洁版的写法,值得学习。

1、for循环实现先走N步,简洁明了;

2、在head前再加一个Node,这样当N等于链表长度时,也是OK的了;

3、循环到fast.next=None时停止,这样需要删除的就是slow.next了,不需要额外设置一个previous了。

所以后面还是要多思考,多参考别人的写法,改善自己的pytho语言风格。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值