题目描述
给你单链表的头节点 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
代码及注释
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func reverseList(head *ListNode) *ListNode {
// 定义一个pre指针,初始化为nil
var pre *ListNode
// cur指针指向头节点
cur := head
// 循环遍历链表
for cur != nil {
// 保存当前节点的下一个节点
next := cur.Next
// 将当前节点的next指针指向pre
cur.Next = pre
// pre和cur节点都向前移动一位
pre = cur
cur = next
}
// 最后,pre指向新的头节点
return pre
}
代码解释
- 初始化
pre
为nil
,这是反转链表时新链表的尾节点。 - 使用
cur
遍历原链表,cur
指向当前遍历到的节点。 - 在循环中,首先保存
cur
的下一个节点到next
。 - 将
cur
的Next
指针指向pre
,这一步是实现反转的关键。 - 然后移动
pre
和cur
,将cur
移到下一个节点。 - 循环直到
cur
为nil
,表示原链表已经遍历完。 - 返回
pre
,即新的头节点。
这样,原链表就被完全反转了。