one-pass解法,搬运至leetcode官方题解第29题,4个重点在代码里标出,避免冗余代码
https://leetcode.com/problems/remove-nth-node-from-end-of-list/solution/

class Solution:
    def removeNthFromEnd(self , head , n ):
        # write code here
        dummy = ListNode(0)
        dummy.next = head
        lo, hi = dummy, dummy #重点1: 不是指向head,而是head的前驱结点

        for i in range(n+1): #重点2: 第一次循环n+1次,而不是n次
            if not hi: # 这一句也可以不要,test case中没有出现n大于链表长度的情形
                return head.next 
            hi = hi.next

        while hi: #重点3: 这样写循环条件,循环结束后,lo.next就是待删除的结点
            lo = lo.next
            hi = hi.next

        lo.next = lo.next.next
        return dummy.next # 重点4:不能return head,否则test case{1}, 1过不了