由于题中已经表示 n 一定有效,因此不考虑 n 无效的情况。
限定时间复杂度为 O(n), 说明需要在一个循环内完成,因此我们使用前后指针的形式。
使用 pre 表示当前节点 cur 的前一个结点,next 结点表示距离当前结点 cur 为 n 的结点,因此,当 cur 移动到最后一个结点时,此时删除 cur 就完成了题目中的要求。

package main
import . "nc_tools"
/*
 * type ListNode struct{
 *   Val int
 *   Next *ListNode
 * }
 */

/**
  * 
  * @param head ListNode类 
  * @param n int整型 
  * @return ListNode类
*/
func removeNthFromEnd( head *ListNode ,  n int ) *ListNode {
    // write code here\
    var root *ListNode
    root = &ListNode{Val: 0,Next: nil}
    root.Next = head
    var pre *ListNode
    var cur *ListNode
    var next *ListNode
    pre = root
    cur = head
    next = head
    for i:=1;i<n;i++{
        next = next.Next
    }

    for next!=nil&&next.Next!=nil{
        pre = pre.Next
        cur = cur.Next
        next = next.Next
    }

    pre.Next = cur.Next
    return root.Next
}