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

例题一共包含四个文件。运行程序前提:项目安装了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的路径参数。

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

  1. C++版 - 剑指offer 面试题5:从尾到头打印链表 题解

    面试题5:从尾到头打印链表 提交网址: http://www.nowcoder.com/practice/d0267f7f55b3412ba93bd35cfa8e8035?tpId=13&tq ...

  2. 【剑指offer】面试题 6. 从尾到头打印链表

    面试题 6. 从尾到头打印链表 NowCoder 题目描述 输入一个链表的头结点,从尾到头反过来打印出每个结点的值. Java 实现 ListNode Class class ListNode { i ...

  3. JS 剑指Offer(四) 从尾到头打印链表

    题目:输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回). 首先定义一下链表中的节点,关于链表这个数据结构在另外一篇文章中会详细讲 function ListNode(val) { t ...

  4. 剑指Offer面试题:4.从尾到头打印链表

    一.题目:从尾到头打印链表 题目:输入一个链表的头结点,从尾到头反过来打印出每个结点的值. 到解决这个问题肯定要遍历链表.遍历的顺序是从头到尾的顺序,可输出的顺序却是从尾到头.也就是说第一个遍历到的结 ...

  5. P51、面试题5:从尾到头打印链表

    题目:输入一个链表的头结点,从尾到头反过来打印出每个结点的值. 链表结点定义如下: Struct ListNode{ int   m_nKey; ListNode*   m_pNext; }; 我们可 ...

  6. 剑指offer第二版面试题5:从尾到头打印链表(JAVA版)

    题目描述: 输入一个链表,从尾到头打印链表每个节点的值.返回新链表. import java.util.Stack; //定义链表结构 class ListNode { int value; List ...

  7. offer--链表反转和从尾到头打印链表

    这个是高频的面试题,今天总结了一些.反转链表用三个指针实现,返回新链表的头节点:而从尾到头打印,应用栈实现,返回vector整个链表. //题目描述 // //输入一个链表,反转链表后,输出链表的所有 ...

  8. 九度OJ 1511 从尾到头打印链表

    题目地址:http://ac.jobdu.com/problem.php?pid=1511 题目描述: 输入一个链表,从尾到头打印链表每个节点的值. 输入: 每个输入文件仅包含一组测试样例. 每一组测 ...

  9. 剑指Offer 从尾到头打印链表

    题目描述 输入一个链表,从尾到头打印链表每个节点的值. 输入描述: 输入为链表的表头 输出描述: 输出为需要打印的“新链表”的表头 思路: 用容器vector,递归到最后一个元素,push_back到 ...

随机推荐

  1. APP纯黑盒测试—某些可以试试的操作

    一.多次快速点击一处功能入口: 该测试方法可以在某些应用中打开俩次目标界面,举一些具体一点的例子: 1.比如现在很多APP需要登陆,如果打开了俩次登录页面,就容易造成登录成功后应用跳转界面又是登录界面 ...

  2. Hadoop家族系列文章

    转自:http://blog.fens.me/series-hadoop-family/ Hadoop家族系列文章,主要介绍Hadoop家族产品,常用的项目包括Hadoop, Hive, Pig, H ...

  3. java-----四种引用

    java的四种引用,强弱软虚,用到的场景 标签: java的引用 强弱软虚 2016-05-11 22:59 1237人阅读 评论(0) 收藏 举报 1.强引用(StrongReference) 强引 ...

  4. jquery cdn加速注意事项

    1, <script src="http://libs.baidu.com/jquery/1.7.2/jquery.min.js"></script> 这里 ...

  5. WORD里怎样能做到局部“分栏”就是一页里有的分有的不分

    选中你要分的部分再分栏如果不想分的部分也被分了,那就可以选中不想分的那部分,选择“分栏”->“一栏” 转自:http://zhidao.baidu.com/question/9873268.ht ...

  6. WebService的初级学习

    复习准备 1. Schema约束: 1.1   namespace相当于Schema文件的id: 1.2   targetNamespace属性用来指定schema文件的namespace的值; 1. ...

  7. [转]seajs详解

    [转]seajs详解 SeaJS 是一个遵循commonJS规范的javascript模块加载框架,可以实现javascript的模块化开发和模块化加载(kk:模块可按需加载或全部加载). SeaJS ...

  8. Android 切换主题 (二)

    Android 切换主题 (二) 背景 我原来写过一篇文章关于 android 切换主题的文章 -- Android 切换主题以及换肤的实现 , 里面介绍了如何使用 setTheme() 来切换主题, ...

  9. redhad linux 7 安装ftp服务

    1. 查看有没有安装 rpm -qa|grep vsftpd 2.安装vsftp yum install vsftpd -y 3. 启动vsftp /sbin/service vsftpd start ...

  10. handlebears使用

    Handlebars 文档笔记: http://www.ghostchina.com/handlebars-wen-dang-bi-ji/ Handlebars模板引擎中的each嵌套及源码浅读: h ...