# 206.E 反转链表

> Problem: [206. 反转链表](https://leetcode.cn/problems/reverse-linked-list/description/)

## 思路

思路1：递归。先反转从第二个节点开始的其他节点，然后再把第一个节点放到最后。

思路2：从第二个节点开始遍历，依次把`cur.next`指向`preHead`。最后需要记得把`head.next`指向`nil`

## Code

代码1：

```go
func reverseList(head *ListNode) *ListNode {
	// 为避免空指针问题，此处应该包含head.Next == nil的情况
	if head == nil || head.Next == nil {
		return head
	}

	newHead := reverseList(head.Next)
	head.Next.Next = head
	head.Next = nil //把原头结点的next指向nil，避免成环
	return newHead
}
```

代码2：

```go
/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func reverseList(head *ListNode) *ListNode {
	// 为避免空指针问题，此处应该包含head.Next == nil的情况
	if head == nil || head.Next == nil {
		return head
	}

	preHead := head
	cur := head.Next
	for cur != nil {
		next := cur.Next //暂存下一个节点
		cur.Next = preHead
		preHead = cur
		cur = next
	}
	head.Next = nil
	return preHead
}
```
