面试题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的路径参数。
面试题5:JS实现从尾到头打印单链表的更多相关文章
- C++版 - 剑指offer 面试题5:从尾到头打印链表 题解
面试题5:从尾到头打印链表 提交网址: http://www.nowcoder.com/practice/d0267f7f55b3412ba93bd35cfa8e8035?tpId=13&tq ...
- 【剑指offer】面试题 6. 从尾到头打印链表
面试题 6. 从尾到头打印链表 NowCoder 题目描述 输入一个链表的头结点,从尾到头反过来打印出每个结点的值. Java 实现 ListNode Class class ListNode { i ...
- JS 剑指Offer(四) 从尾到头打印链表
题目:输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回). 首先定义一下链表中的节点,关于链表这个数据结构在另外一篇文章中会详细讲 function ListNode(val) { t ...
- 剑指Offer面试题:4.从尾到头打印链表
一.题目:从尾到头打印链表 题目:输入一个链表的头结点,从尾到头反过来打印出每个结点的值. 到解决这个问题肯定要遍历链表.遍历的顺序是从头到尾的顺序,可输出的顺序却是从尾到头.也就是说第一个遍历到的结 ...
- P51、面试题5:从尾到头打印链表
题目:输入一个链表的头结点,从尾到头反过来打印出每个结点的值. 链表结点定义如下: Struct ListNode{ int m_nKey; ListNode* m_pNext; }; 我们可 ...
- 剑指offer第二版面试题5:从尾到头打印链表(JAVA版)
题目描述: 输入一个链表,从尾到头打印链表每个节点的值.返回新链表. import java.util.Stack; //定义链表结构 class ListNode { int value; List ...
- offer--链表反转和从尾到头打印链表
这个是高频的面试题,今天总结了一些.反转链表用三个指针实现,返回新链表的头节点:而从尾到头打印,应用栈实现,返回vector整个链表. //题目描述 // //输入一个链表,反转链表后,输出链表的所有 ...
- 九度OJ 1511 从尾到头打印链表
题目地址:http://ac.jobdu.com/problem.php?pid=1511 题目描述: 输入一个链表,从尾到头打印链表每个节点的值. 输入: 每个输入文件仅包含一组测试样例. 每一组测 ...
- 剑指Offer 从尾到头打印链表
题目描述 输入一个链表,从尾到头打印链表每个节点的值. 输入描述: 输入为链表的表头 输出描述: 输出为需要打印的“新链表”的表头 思路: 用容器vector,递归到最后一个元素,push_back到 ...
随机推荐
- JS 拖动原理
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- sql 更新字段
UPDATE YpeopleSET power='0'WHERE power='1'; UPDATE Ypeople SET power='1' WHERE power='0' and pid='22 ...
- Restful Web Service初识
一.Web Services Web Services 是一种基于组件的软件平台,是面向服务的Internet 应用.Web Services 框架的核心技术包括SOAP ,WSDL 和UDDI ,它 ...
- CStringArray序列化处理
开发中需要对CStringArray进行保存操作,涉及到序列化,特总结一下: //写 CStringArray saTmp1; CStringArray saTmp2 saTmp1.AddString ...
- VC++ 创建自己的头文件包含GUID
Guidgen 是比较好用的工具之一,可以使用它来创建ActiveX控件的UUID,同时可以创建独特的剪贴板格式名称和唯一的标识符的内核对象, 如信号量.互斥和事件. 但我需要为另一个目的创建一个唯 ...
- hdu 4291(矩阵+暴力求循环节)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4291 思路:首先保留求出循环节,然后就是矩阵求幂了. #include<iostream> ...
- 灵活的javaScript
通常我们不像下面这样声明函数,因为会创建很多全局变量. function checkName() { // code } function checkEmail() { // code } 所以,我们 ...
- POJ2139 Six Degrees of Cowvin Bacon [Floyd]
水题,随手敲过 一看就是最短路问题,a,b演同一场电影则他们的距离为1 默认全部两两原始距离无穷,到自身为0 输入全部数据处理后floyd 然后照它说的求平均分离度 再找最小的,×100取整输出 #i ...
- Linux 文件夹含义(转)
1./bin :获得最小的系统可操作性所需要的命令 2./boot :内核和加载内核所需的文件 3./dev :终端.磁盘.调制解调器等的设备项 4./etc :关键的启动文件和配置文件 5./hom ...
- Ubuntu16.04最快捷搭建小型局域网Git服务器
导读 使用linux操作系统,不得不提Git版本管理器,这个Linus花了两周时间开发的分布式版本管理器(这就是大神,先膜了个拜...),毫无疑问,Git版本管理器与linux系统有着与生俱来的同一血 ...