'''
给定一个链表，删除链表的倒数第 n 个节点，并且返回链表的头结点。
示例：给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后，链表变为 1->2->3->5.
说明：给定的 n 保证是有效的。
进阶：
你能尝试使用一趟扫描实现吗？
'''


# Definition for singly-linked list.
class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None

class Solution:
    def removeNthFromEnd(self, head, n):
        if head is None or n < 1:
            return None

        dummy = ListNode(0)
        dummy.next = head

        fast = dummy

        while n:
            fast = fast.next
            n -= 1
        slow = dummy

        while fast and fast.next:
            slow = slow.next
            fast = fast.next

        # if slow.next:
        slow.next = slow.next.next

        return dummy.next

s = Solution()
node1 = ListNode(1)
node2 = ListNode(2)
node3 = ListNode(3)
node4 = ListNode(4)
node5 = ListNode(5)

node1.next = node2
node2.next = node3
node3.next = node4
node4.next = node5

head = s.removeNthFromEnd(node1,2)
while head:
    print(head.val)
    head = head.next
