essay
hot100-反转链表
#算法
hot100——反转链表
给你单链表的头节点 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
解
func reverseList(head *ListNode) *ListNode {
// prev 指向已反转部分的头节点,初始时没有已反转部分,所以为 nil
var prev *ListNode = nil
// curr 指向当前正在处理的节点,从原链表的头节点开始
curr := head
// 只要当前节点不为空,就继续处理
for curr != nil {
// 1. 保存当前节点的下一个节点,防止反转指针后丢失后续链表
next := curr.Next
// 2. 将当前节点的 Next 指针指向前一个节点(即反转方向)
curr.Next = prev
// 3. 将 prev 向前移动:现在 curr 已加入反转部分,成为新的头
prev = curr
// 4. 将 curr 向前移动到下一个待处理的节点(即之前保存的 next)
curr = next
}
// 循环结束时,curr 为 nil,prev 指向原链表的最后一个节点,
// 也就是反转后新链表的头节点,因此返回 prev
return prev
}