206. 反转链表
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
示例 1:

输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]
示例 2:

输入:head = [1,2]
输出:[2,1]
示例 3:
输入:head = []
输出:[]
提示:
- 链表中节点的数目范围是 [0, 5000]
- -5000 <= Node.val <= 5000
进阶:链表可以选用迭代或递归方式完成反转。你能否用两种方法解决这道题?
解题思路
Go 代码
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func reverseList(head *ListNode) *ListNode {
// 经典头插法,cur一直指着需要头插的节点
if head == nil || head.Next == nil {
return head
}
dummy := &ListNode{}
dummy.Next = head
cur := dummy.Next.Next // cur从一开始就指着需要头插的节点,表示本次要插入到dummy后的结点
tail := dummy.Next //tail指向一直不变,改变的是tail.next,用于将已经反转的部分链表和剩余还需要反转的链表相连
for cur != nil {
tail.Next = cur.Next //将已经反转的部分链表和剩余还需要反转的链表相连
cur.Next = dummy.Next
dummy.Next = cur
cur = tail.Next //下一个要头插的节点
}
return dummy.Next
}

2176

被折叠的 条评论
为什么被折叠?



