题目描述
给你单链表的头节点 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指向原链表的最后一个节点,也就是反转后链表的头节点。
- 当
代码
javascript
/**
* 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;
};