反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
function ListNode(val) {
this.val = val;
this.next = null;
}
var reverseList = function(head) {
var reverse = new ListNode(),
current = reverse,
node_arr = [],
i = 0,
l = 0;
while(head.next || head.next === null) {
node_arr.unshift({'val':head.val,'next':null});
i++;
if(head.next === null) break;
head = head.next;
}
for(;l<i;l++){
current.next = new ListNode(node_arr[l].val);
current = current.next;
}
return reverse.next;
};
可以说上面的代码完全是自己按照自己的想法乱来的,即没考虑时间复杂度也没考虑到与操作链表相关的算法。
改进如下:
var reverseList = function(head) {
var p = head,
q = null;
while(p) {
var tmp = p;
p = p.next;
tmp.next = q;
q = tmp;
}
return q;
}
复习了数据结构后采用头插法来实现。难点在于如何每次在头部插入节点,c的实现L->next = p->next ; L->next = p
而在js中无法保证每次都能获取到指向头节点的引用所以如上代码中的 tmp.next = q ; q = tmp
所示动态的生成需要前插的节点。总的来说思想相同,实现不同而已。head在js中的数据结构如下:
var head = {
'val': 1,
'next': {
'val': 2,
'next': {
'val': 3,
'next': {
'val': 4,
'next': {
'val': 5,
'next': null
}
}
}
}
};
网友评论