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

例题一共包含四个文件。运行程序前提:项目安装了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. 错题0913-java

    子类A继承父类B, A a = new A(); 则父类B构造函数.父类B静态代码块.父类B非静态代码块.子类A构造函数.子类A静态代码块.子类A非静态代码块 执行的先后顺序是? A:父类B静态代码块 ...

  2. (转)word尾注引文添加方式及相关问题

    word引文添加方式:http://www.office68.com/word/word-reference-add.html word通配符:http://www.3lian.com/edu/201 ...

  3. sdut 2153:Clockwise(第一届山东省省赛原题,计算几何+DP)

    Clockwise Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 Saya have a long necklace with ...

  4. hdu 2025:查找最大元素(水题,顺序查找)

    查找最大元素 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  5. ajax 请求登录超时跳转登录页的示例代码

    Ajax AJAX即“Asynchronous Javascript + XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术. 在Filter里判断是否登录,如果未 ...

  6. jQuery实现tag便签去重效果的方法

    本文实例讲述了jQuery实现tag便签去重效果的方法.分享给大家供大家参考.具体实现方法如下: html代码如下: <head><script type="text/ja ...

  7. python入门(八):连接mysql和STMP

    Python3 MySQL 数据库连接,使用 PyMySQL 连接数据库,并实现简单的增删改查.  mysql连接步骤 1.打开数据库连接 2.使用cursor()方法获取操作游标 3.执行sql和异 ...

  8. CPU GPU设计工作原理《转》

    我知道这非常长,可是,我坚持看完了.希望有幸看到这文章并对图形方面有兴趣的朋友,也能坚持看完.一定大有收获.毕竟知道它们究竟是怎么"私下勾搭"的.会有利于我们用程序来指挥它们... ...

  9. [SharePoint 2010] Visual Studio 2010內撰寫視覺化WebPart超簡單

    新一代的Visual Studio 2010對於SharePoint 2010的專案撰寫,有非常另人讚賞的改進. 以往寫一個WebPart要搞好多雜七雜八的步驟,也要硬寫HTML輸出,當然有人說可以寫 ...

  10. [转]Mac下cocos2dx-3.2+Xcode环境配置和项目创建

    原文:http://blog.csdn.net/u012200908/article/details/38070885 这是有关环境配置的第二篇教程,第一篇讲的是win8下的环境配置.这里我们使用C+ ...