题目
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
示例 1:
输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]
示例 2:
输入:head = [1,2]
输出:[2,1]
示例 3:
输入:head = []
输出:[]
题解一 迭代
var reverseList = function(head) {
let prev = null;
let curr = head;
while (curr) {
const next = curr.next;
curr.next = prev;
prev = curr;
curr = next;
}
return prev;
};
笔记:
- 先把下一个节点储存起来,以便cur在链表中继续向下一个节点移动,然后改变cur的指向(将pre赋给next),接着将cur和pre分别向前移动(先把现有的cur赋给pre,cur才能继续往前走)。因为最后的cur移动到null,循环结束,pre移动到最后一个节点,即为head节点
题解二 递归
var reverseList = function(head) {
if (head == null || head.next == null) return head
const p = reverseList(head.next)//分解子问题
head.next.next = head//前面已经排好的忽略,将现在的head.next的指向反过来
//为什么不用p?
head.next = null//head的指向也要反过来,即头部指向null
return p
};
笔记:
- 为什么不用p?p是最终的结果,head是带入的参数,只需要最后用p承接一下结果的head就行了