面试题5:JS实现从尾到头打印单链表

单链表,在内存中所占地址是不连续的。所以遍历单链表时:需要从头遍历。而题目要求输出的顺序:从尾到头。也就是说第一个遍历到的节点最后一个输出,而最后一个遍历到的节点第一个输出。这就是典型的“后进先出”,我们可以用栈来实现这种顺序。

例题一共包含四个文件。运行程序前提:项目安装了nodejs

1.stack_list.js:实现了一个普通的栈。

/**
 * Created by ym-Wang on 2016/8/16.
 */
function Stack(){
    this.top = null;
    this.size = 0;
}

Stack.prototype = {
    initStack:function(){
        return new Stack();
    },
    push:function(data){
        var node = {
            data:data,
            next:null
        };
        node.next = this.top;
        this.top = node;
        this.size++;
    },
    pop:function(){
        if(this.isStackEmpty()){
            console.log("stack is Empty");
            return false;
        }
        var out = this.top;
        this.top = this.top.next;
        if(this.size > 0){
            this.size--;
        }
        return out.data;
    },
    clearStack:function(){
        this.top = null;
        this.size = 0;
    },
    isStackEmpty:function(){
        return this.top == null?true:false;
    }
};

function stackConstructor(){
    return new Stack();
};

exports.stackConstructor = stackConstructor;

2.createNode.js:用于初始化节点

(function(){
    "use strict";
    function Node(element){
        this.element = element;
        this.next = null;
    }
    function nodeConstructor(element){
        return new Node(element);
    };

    exports.nodeConstructor = nodeConstructor;
})();

3.createList.js:实现一个单链表

(function(){
    "use strict";
    var node = require("./createNode.js");
    function LinkedList(){
        this._head = node.nodeConstructor("This is Head Node");
        this._size = 0;
    }
    LinkedList.prototype = {
        isEmpty:function(){
            if(this._size == 0){
                return true;
            }else{
                return false;
            }
        },
        size:function(){
            return this._size;
        },
        getHead:function(){
            return this._head;
        },
        display:function(){
            var currNode = this.getHead().next;
            while(currNode){
                console.log(currNode.element);
                currNode = currNode.next;
            }
        },
        remove:function(item){
            if(item){
                var preNode = this.findPre(item);
                if(preNode == null){
                    return;
                }
                if(preNode.next != null){
                    preNode.next = preNode.next.next;
                    this._size--;
                }
            }
        },
        add:function(item){
            this.insert(item);
        },
        insert:function(newElement,item){
            //在指定位置item后插入newElement节点,如果未找到item,则插入到链表结尾。
            var newNode = node.nodeConstructor(newElement);
            var finder = item?this.find(item):null;
            if(!finder){
                var last = this.findLast();
                last.next = newNode;
            }else{
                newNode.next = finder.next;
                finder.next = newNode;
            }
            this._size++;
        },
        findLast:function(){
            //返回最后一个及节点
            var currNode = this.getHead();
            while(currNode.next){
                currNode = currNode.next;
            }
            return currNode;
        },
        findPre:function(item){
            //返回指定元素的上一个节点
            var currNode = this.getHead();
            while(currNode.next != null&&currNode.next.element !=item){
                currNode = currNode.next;
            }
            return currNode;
        },
        find:function(item){
            if(item == null){
                return null;
            }
            var currNode = this.getHead();
            while(currNode && currNode.element != item){
                currNode = currNode.next;
            }
            return currNode;
        }
    };
    exports.linkedList= new LinkedList();
})();

4.desending.js:倒序输出单链表

(function(){
    var singleList = require("./createList.js");
    var stack_list = require("./stack_list.js");
    var list = singleList.linkedList;
    var stack = stack_list.stackConstructor();
    list.add(1);
    list.add(12);
    list.add(123);
    list.add(1234);
    var curNode = list.getHead();
    while(curNode.next !== null){
        stack.push(curNode.next.element);
        curNode = curNode.next;
    }
    while(stack.size!=0){
        var ele = stack.pop();
        console.log(ele);
    }
})();

 注意:我的项目中这四个文件是在同一目录下的。如果不在同一目录下,需要修改require的路径参数。

时间: 2024-12-25 07:45:41

面试题5:JS实现从尾到头打印单链表的相关文章

剑指offer(3):从尾到头打印单链表

输入一个链表,从尾到头打印链表每个节点的值. /** * struct ListNode { * int val; * struct ListNode *next; * ListNode(int x) : * val(x), next(NULL) * } * }; */ class Solution { public: vector<int> printListFromTailToHead(ListNode* head) { vector<int> inverse; stack&l

从尾到头打印单链表

void PrintTailToHead(PLinkList pList) { if (pList) { PrintTailToHead(pList->next); printf("%d->", pList->data); } }

【C语言】单链表的相关热点面试题(包括:从尾到头打印,逆置,冒泡,寻找中间节点,倒数k节点)

从尾到头打印单链表 void FromTailToHeadPrint(SListNode*& head) {     stack<SListNode*> s;     SListNode* cur = head;     while (cur)     {         s.push(cur);         cur = cur->_next;     }     while (!s.empty())     {         cout << s.top()-&

LeetCode | 面试题06. 从尾到头打印链表【剑指Offer】【Python】

LeetCode 面试题06. 从尾到头打印链表[剑指Offer][Easy][Python][链表] 问题 力扣 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回). 示例 1: 输入:head = [1,3,2] 输出:[2,3,1] 限制: 0 <= 链表长度 <= 10000 思路 解法一 reverse函数 时间复杂度: O(n),n为 head 链表长度. 空间复杂度: O(n),n为 head 链表长度. Python3代码 # Definition for si

《剑指Offer》题目——从尾到头打印链表

题目描述:输入一个链表,从尾到头打印链表每个节点的值. 题目分析:用栈:Java用Stack不如用Deque接口,原因可以见链接:http://stackoverflow.com/questions/12524826/why-should-i-use-deque-over-stack public class ReverseList { class ListNode{ int val; ListNode next = null; ListNode(int val){ this.val = val

从尾到头打印链表

参与人数:4164时间限制:1秒空间限制:32768K 通过比例:16.80% 最佳记录:0 ms|0K(来自  黄昏的足迹) 题目描述 输入一个链表,从尾到头打印链表每个节点的值. 提交时间:2015-09-25 语言:C++ 运行时间:0ms 占用内存:8552K 状态:答案正确 /* 遍历一次链表,每遍历到一个结点,就将结点的值插入到vecotr的开始. */ /** * struct ListNode { * int val; * struct ListNode *next; * Lis

5-从尾到头打印链表

题目描述:http://ac.jobdu.com/problem.php?pid=1511 输入一个链表,从尾到头打印链表每个节点的值. 输入: 每个输入文件仅包含一组测试样例. 每一组测试案例包含多行,每行一个大于0的整数,代表一个链表的节点.第一行是链表第一个节点的值,依次类推.当输入到-1时代表链表输入完毕.-1本身不属于链表. 输出: 对应每个测试案例,以从尾到头的顺序输出链表每个节点的值,每个值占一行. 逆序打印链表,我们遍历链表只能从头到尾,现在要求我们从尾到头.后进先出,可以想到用

九度oj题目1511:从尾到头打印链表

题目1511:从尾到头打印链表 时间限制:1 秒 内存限制:128 兆 特殊判题:否 提交:6010 解决:1805 题目描述: 输入一个链表,从尾到头打印链表每个节点的值. 输入: 每个输入文件仅包含一组测试样例.每一组测试案例包含多行,每行一个大于0的整数,代表一个链表的节点.第一行是链表第一个节点的值,依次类推.当输入到-1时代表链表输入完毕.-1本身不属于链表. 输出: 对应每个测试案例,以从尾到头的顺序输出链表每个节点的值,每个值占一行. 样例输入: 1 2 3 4 5 -1 样例输出

《剑指offer》— JavaScript(3)从尾到头打印链表

从尾到头打印链表 题目描述 输入一个链表,从尾到头打印链表每个节点的值. 实现代码 /*function ListNode(x){ this.val = x; this.next = null; }*/ function printListFromTailToHead(head) { var res=[]; while(head){ res.unshift(head.val); head=head.next; } return res; } 相关知识 创建一个链表,并实现插入,删除,添加的方法