BM1 反转链表
题目描述:
给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。
数据范围: 0≤n≤1000
要求:空间复杂度 O(1),时间复杂度 O(n)。
如当输入链表{1,2,3}时,
经反转后,原链表变为{3,2,1},所以对应的输出为{3,2,1}。
以上转换过程如下图所示:
示例1
输入:{1,2,3}
返回值:{3,2,1}
示例2
输入:{}
返回值:{}
说明:空链表则输出空
解题思路:
- 判断pHead是否为空,如果链表为空则返回pHead本身即为空链表,如果pHead长度为1则不用反转。
- 反转链表
保留当前节点,对当前节点的next操作,首先将后面的链表保存为p1
,再将当前链表节点的next节点指向该节点前反转好的链表p2
(如果是首次反转说明当前节点是反转后的最后节点,该节点反转后应指向null),随后更新反转链表p2
,将当前节点丢弃,更新为p1
保存的未反转链表。
- 第一次循环:
p1: 2->3->null
p1 = pHead.next;
pHead: 1->null
pHead.next = p2;
p2: 1->null
p2 = pHead;
pHead = 2->3->null
pHead = p1;- 第二次循环
p1: 3->null
p1 = pHead.next;
pHead: 2->1->null
pHead.next = p2;
p2: 2->1->null
p2 = pHead;
pHead = 3->null
pHead = p1;- 第三次循环
p1: null
p1 = pHead.next;
pHead: 3->2->1->null
pHead.next = p2;
p2: 3->2->1->null
p2 = pHead;
pHead = null
pHead = p1;
function ListNode(x){
this.val = x;
this.next = null;
}
function ReverseList(pHead)
{
//如果链表为空则返回pHead本身即为空链表,如果pHead长度为1则不用反转返回本身即可
if(pHead == null || pHead.next == null) {
return pHead;
}
let p1 = null, p2 = null;
while(pHead){
p1 = pHead.next;
pHead.next = p2;
p2 = pHead;
pHead = p1;
}
return p2;
}
module.exports = {
ReverseList : ReverseList
};