题目描述
给你单链表的头节点 head
,请你反转链表,并返回反转后的链表。
示例 1:
输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]
示例 2:
输入:head = [1,2]
输出:[2,1]
示例 3:
输入:head = []
输出:[]
解题思路
链表反转的核心思想是遍历链表,逐个节点地改变其指向,使得每个节点的next
指针指向它的前一个节点,而不是后一个节点。最终,我们将得到一个头尾颠倒的链表。
具体步骤
-
初始化三个指针:
pre
:用来指向当前节点的前一个节点,初始时为null
。cur
:用来遍历链表,初始时指向头节点head
。next
:临时存储cur
的下一个节点,用于在改变cur.next
指针后,不丢失对链表的引用。
-
遍历链表:
- 使用一个循环,从
head
开始,直到cur
为null
(即链表末尾)。
- 使用一个循环,从
-
反转指针:
- 在每次循环中,首先保存
cur
的下一个节点到next
。 - 然后,将
cur.next
指向pre
,实现反转。 - 接着,将
pre
和cur
向前移动一位,pre
变为cur
,cur
变为next
。
- 在每次循环中,首先保存
-
结束循环:
- 当
cur
为null
时,循环结束。此时pre
指向原链表的最后一个节点,也就是反转后链表的头节点。
- 当
代码
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} head
* @return {ListNode}
*/
var reverseList = function(head) {
let pre = null; //当前节点的前一个节点
let cur = head; //当前节点,初始时指向头节点head
while(cur != null){
let next = cur.next;
cur.next = pre;
pre = cur;
cur = next;
}
return pre;
};