23.反转链表(学习)
给你单链表的头节点 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
解析:
一、初始化指针:
1.prev 指针:用于跟踪当前节点的前一个节点,初始时设置为 null,因为反转后的链表的头节点前面没有节点。
2.curr 指针:用于遍历原始链表,初始时设置为链表的头节点 head。
二、迭代遍历链表:
1.在每次迭代中,首先保存 curr 节点的下一个节点到 nextTemp 变量中,以防丢失。
2.然后,将 curr 节点的 next 指针指向 prev,这样就完成了当前节点的反转。
3.接着,将 prev 和 curr 都向前移动一位。具体来说,prev 变成当前的 curr,而 curr 变成之前保存的 nextTemp。
三、返回新的头节点:
1.当 curr 变为 null 时,说明已经遍历完了整个链表,此时 prev 指针将指向新的头节点(即原链表的尾节点)。
2.返回 prev 指针作为反转后链表的头节点。
var reverseList = function(head) {
let prev = null; // 前一个节点,初始化为null
let curr = head; // 当前节点,初始化为头节点
while (curr !== null) {
let nextTemp = curr.next; // 临时保存当前节点的下一个节点
curr.next = prev; // 将当前节点的next指针指向前一个节点,实现反转
prev = curr; // 前一个节点前进到当前节点
curr = nextTemp; // 当前节点前进到原来的下一个节点
}
return prev; // 当循环结束时,prev将会是新的头节点
};