单链表——反转链表
给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。
数据范围: 0\leq n\leq10000≤n≤1000
要求:空间复杂度 O(1)O(1) ,时间复杂度 O(n)O(n) 。
如当输入链表{1,2,3}时,
经反转后,原链表变为{3,2,1},所以对应的输出为{3,2,1}。
以上转换过程如下图所示:
其中一种解法
/*function ListNode(x){
this.val = x;
this.next = null;
}*/
function ReverseList(pHead)
{
// 判断链表为空或长度为1的特殊情况
if(pHead == null || pHead.next == null){
return pHead;
}
// 进入正文,定义两个空指针p1,p2
// p1 用来存储pHead后面的链表
// p2 用来存储新的反转后的链表
let p1 = null,
p2 = null;
// 通过循环来实现反转,
// 1,先把表头之外的链表存储起来;
// 2,把表头独立出来变成新链表的头;
// 3,把新链表存储到p2
// 4,把之前p1存储的链表又存储到pHead中
// 重复操作,直到原来的链表为空指针
while(pHead!=null){
// p1: 2->3->null
p1 = pHead.next
// pHead: 1->null
pHead.next = p2
// p2: 1->null
p2 = pHead
// pHead: 2->3->null
pHead = p1
}
return p2
}
module.exports = {
ReverseList : ReverseList
};
我个人认为比较难理解的点就是链表的赋值操作,老是把它当成一个值类型或者一个引用类型的地址,可能也是我之前对值类型和引用类型得理解不够到位,当时是纠结了好半天。最后把它想象成一个链子才理解了(本来就是链表,是我钻牛角尖了)