# 19.M 删除链表的倒数第 N 个结点

> Problem: [19. 删除链表的倒数第 N 个结点](https://leetcode.cn/problems/remove-nth-node-from-end-of-list/description/)

## 思路

**思路1:**

* 先计算链表的长度
* 设置一个`dummy`节点，简化处理
* 先把`pre`指向`dummy`，然后走`len-n`步，找到需要移除节点的上一个节点
* 然后让`pre`节点指向下下个节点
* 最后返回`dummy.next`

**思路2:**\
只需要遍历一次。

* 让`first`指向`head`，然后走`n`步
* 让`second`指向`dummy`
* 然后`first`和`second`一起走，直到`first`为空
* 再让`second`指向下下个节点
* 最后返回`dummy.next`

## Code

代码1：

```go
func removeNthFromEndV1(head *ListNode, n int) *ListNode {
	len := 0
	p := head
	for p != nil {
		len++
		p = p.Next
	}

	var dummy = &ListNode{Val: -1, Next: head}
	pre := dummy
	for i := 0; i < len-n; i++ {
		pre = pre.Next
	}

	pre.Next = pre.Next.Next
	return dummy.Next
}
```

代码2：

```go
/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func removeNthFromEnd(head *ListNode, n int) *ListNode {
	dummy := &ListNode{Val: -1, Next: head}
	first := head //注意此处为head
	second := dummy
	for i := 0; i < n; i++ {
		first = first.Next
	}

	for first != nil {
		first = first.Next
		second = second.Next
	}

	second.Next = second.Next.Next
	return dummy.Next
}
```
