【剑指offer】从尾到头打印链表

  |   0 评论   |   0 浏览

题目

输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。

我的答案

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} head
 * @return {number[]}
 */
var reversePrint = function(head) {
    const valueStack = [];
    let currentNode=head;
    while(currentNode){
        valueStack.push(currentNode.val);
        currentNode=currentNode.next;
    }
    return valueStack.reverse()
};

优化

上述做法非常节省内存,但是用时较长,这是因为数组的reserve话费时间较长,所以想要提升速度,就需要不出现需要数组反转的情况。当改变思路,在数据加入数组时,使用unshift,这样速度也能有所提升。但是并不是我们想要的最快的结果。

最快的方法是,使用两个指针先将列表反转,然后沿着反转后的列表记录数组。

翻转列表:记录第一个和第二个节点,将第二个节点的next指向第一个,以此类推。

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} head
 * @return {number[]}
 */
var reversePrint = function(head) {
    const valueStack = [];
    let currentNode=head;
    let preNode=null;
    while(currentNode){
        const nextCurrent=currentNode.next;
        currentNode.next=preNode;
        preNode=currentNode;
        currentNode=nextCurrent;
    }
    while(preNode){
        valueStack.push(preNode.val);
        preNode=preNode.next;
    }
    return valueStack;
};

标题:【剑指offer】从尾到头打印链表
作者:limanting
地址:https://blog.manxiaozhi.com/articles/2021/08/24/1629786118845.html