leetcode206 链表+javascript
leetcode 206的两种实现思路
实现一:利用堆栈
利用栈后进先出,将值从头到尾push到数组a,后再pop出来,从头到尾赋给原链表。需要两个指针辅助压栈及出栈的赋值(方便最后直接返回head指针,实际运用中根据自己需要确定指针个数即可)
- 注意:虽然利用了两个指针,但其本质不是双指针解法。
var reverseList = function(head) {
const a = [];
let p1 = head;
let p2 = head;
while(p1){
a.push(p1.val); //压栈
p1 = p1.next;
}
while(p2){
p2.val = a.pop();//出栈
p2 = p2.next;
}
return head;
};
实现二:双指针实现
双指针,一跑一追,注意跑在前面的节点应该存储其下一节点为临时节点,因为跑节点会将next设为追节点,以实现反转,从而失去其原本next节点。
var reverseList = function(head) {
let p1 = head; //跑节点
let p2 = null;//追节点
while(p1){
const tmp = p1.next; //临时变量
p1.next = p2;
p2 = p1;
p1 = tmp;
}
return p2;
};