JavaScript封装单向链表的示例代码


Posted in Javascript onSeptember 17, 2020

使用JavaScript封装单向链表:

1. 封装LinkList的类,用于表示我们的链表结构。

2. 在LinkList类中有一个Node类,用于封装每一个节点上的信息(data与next)。

3. 在链表中保存两个属性,一个是链表的长度,一个是链表中的第一个节点。

4.封装一些链表的常用方法:

  • append(element):想列表尾部添加一个新的项;
  • insert(position,element):向列表的特定位置插入一个新的项;
  • get(position):获取对应位置的元素;
  • indexOf(element):返回元素在链表中的索引,如果链表中没有该元素则返回-1;
  • update(position,element):修改某个位置的元素;
  • removeAt(postion):从列表的特定位置移除一项;
  • remove(element):从列表中移除一项;
  • isEmpty():如果链表中不包含任何元素,返回true,否则返回false;
  • size():返回链表中包含元素的个数;
  • toString():输出链表元素的值;
<script type="text/javascript">
	function LinkList(){
		/* 节点类 */
		function Node(data){
			this.data = data
			this.next = null
		}
		
		this.head = null
		this.length = 0
		/* 追加方法 */
		LinkList.prototype.append = function(data){
			/* 创建新节点 */
			var newNode = new Node(data)
			if(this.length === 0){
				this.head = newNode
			}else{
				/* 找到最后一个节点 */
				var current = this.head
				while(current.next){
					current = current.next
				}
				current.next = newNode
			}
			this.length += 1
		}

		/* toString方法 */
		LinkList.prototype.toString = function(){
			var current = this.head
			var listString = ""
			
			while(current){
				listString += current.data +" "
				current = current.next
			}
			return listString
		}

		/* insert方法 */
		LinkList.prototype.insert = function(position,data){
			/* 对position进行越界判断 */
			if(position<0||position>this.length) return false
			var node = new Node(data)
			if(position == 0){
				node.next = this.head
				this.head = node
			}else{
				var index = 0
				var current = this.head
				var previous = null
				while(index++ < position){
					previous = current
					current = current.next
				}
				node.next = current
				previous.next = node
			}
			this.length += 1
			return true
		}
		
		/* get方法 */
		LinkList.prototype.get = function(position){
			/* 越界判断 */
			if(position<0 || position >= this.length) return null
			
			var current = this.head
			var index = 0
			while(index++ < position){
				current = current.next
			}
			return current.data
		}

		/* indexOf方法 */
		LinkList.prototype.indexOf = function(data){
			/* 定义变量 */
			var current = this.head
			var index = 0
			/* 开始查找 */
			while(current){
				if(current.data === data){
					return index
				}else{
					current = current.next
					index += 1
				}
			}
			return -1
		}

		/* update方法 */
		LinkList.prototype.update = function(position,data){
			/* 越界判断 */
			if(position<0 || position >= this.length) return false
			
			var current = this.head
			var index = 0
			while(index++ < position){
				current = current.next
			}
			/* 修改data */
			current.data = data
			return true
		}

		/* removeAt方法 */
		LinkList.prototype.removeAt = function(position){
			/* 越界判断 */
			if(position<0 || position >= this.length) return null
			var current = this.head
			if(position === 0){
				this.head = this.head.next
			}else{
				var index = 0
				var previous = null
				while(index++ < position){
					previous = current
					current = current.next
				}
				previous.next = current.next
			}
			this.length -= 1
			return current.data
		}
		
		/* remove */
		LinkList.prototype.remove = function(data){
			/* 根据data找位置 */
			var position = this.indexOf(data)
			return this.removeAt(position)
		}
		
		LinkList.prototype.isEmpty = function(){
			return this.length === 0
		}
		
		LinkList.prototype.size = function(){
			return this.length
		}
		
	}
	
	
	/* 测试 */
	var list = new LinkList()
	list.append('a')
	list.append('b')
	list.append('c')
	console.log(list.toString()) /* a b c */
	
	list.insert(3,'d')
	console.log(list.toString())/* a b c d */
	
	console.log(list.get(2)) /* c */
	console.log(list.indexOf('d')) /* 3 */
	
	list.update(1,'bbb')
	console.log(list.toString()) /* a bbb c d */
	
	console.log(list.removeAt(2)) /* c */
	console.log(list.toString())/* a bbb d */
	
	console.log(list.remove('a'))
	console.log(list.toString())/* bbb d */
	
	console.log(list.isEmpty()) /* false */
	
	console.log(list.size()) /* 2 */
</script>

以上就是JavaScript封装单向链表的示例代码的详细内容,更多关于JavaScript封装单向链表的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
javascript 学习笔记(一)DOM基本操作
Apr 08 Javascript
js 字符串转换成数字的三种方法
Mar 23 Javascript
JS.getTextContent(element,preformatted)使用介绍
Sep 21 Javascript
移动节点的jquery代码
Jan 13 Javascript
js获取时间并实现字符串和时间戳之间的转换
Jan 05 Javascript
canvas 绘制圆形时钟
Feb 22 Javascript
js中Array对象的常用遍历方法详解
Jan 17 Javascript
基于vue开发微信小程序mpvue-docs跳转页面功能
Apr 10 Javascript
微信小程序实现搜索功能并跳转搜索结果页面
May 18 Javascript
在vue-cli 3中给stylus、sass样式传入共享的全局变量
Aug 12 Javascript
javascript实现一款好看的秒表计时器
Sep 05 Javascript
Vue页面渲染中key的应用实例教程
Jan 12 Vue.js
vue修改Element的el-table样式的4种方法
Sep 17 #Javascript
vue+canvas实现拼图小游戏
Sep 18 #Javascript
JavaScript 常见的继承方式汇总
Sep 17 #Javascript
JavaScript 闭包的使用场景
Sep 17 #Javascript
javascript贪吃蛇游戏设计与实现
Sep 17 #Javascript
js实现简单的随机点名器
Sep 17 #Javascript
谈谈JavaScript中的垃圾回收机制
Sep 17 #Javascript
You might like
php.ini-dist 和 php.ini-recommended 的区别介绍(方便开发与安全的朋友)
2012/07/01 PHP
PHP读取大文件的类SplFileObject使用介绍
2014/04/09 PHP
PHP有序表查找之插值查找算法示例
2018/02/10 PHP
解决laravel session失效的问题
2019/10/14 PHP
js单例模式的两种方案
2013/10/22 Javascript
JavaScript中this的使用详解
2013/11/08 Javascript
随鼠标上下滚动的jquery代码
2013/12/05 Javascript
JS导出PDF插件的方法(支持中文、图片使用路径)
2016/07/12 Javascript
JavaScript页面实时显示当前时间实例代码
2016/10/23 Javascript
详解支持Angular 2的表格控件
2017/01/19 Javascript
详解vue + vuex + directives实现权限按钮的思路
2017/10/24 Javascript
详解vue.js之props传递参数
2017/12/12 Javascript
React中阻止事件冒泡的问题详析
2019/04/12 Javascript
详解微信小程序实现跑马灯效果(附完整代码)
2019/04/29 Javascript
js+canvas实现五子棋小游戏
2020/08/02 Javascript
nestjs中异常过滤器Exceptionfilter的具体使用
2021/02/07 Javascript
Python的for和break循环结构中使用else语句的技巧
2016/05/24 Python
Python模块搜索路径代码详解
2018/01/29 Python
python2.7无法使用pip的解决方法(安装easy_install)
2018/04/03 Python
python 请求服务器的实现代码(http请求和https请求)
2018/05/25 Python
Python PyAutoGUI模块控制鼠标和键盘实现自动化任务详解
2018/09/04 Python
Python中的取模运算方法
2018/11/10 Python
python 读写文件包含多种编码格式的解决方式
2019/12/20 Python
PyCharm 专业版安装图文教程
2020/02/20 Python
python logging.info在终端没输出的解决
2020/05/12 Python
基于FME使用Python过程图解
2020/05/13 Python
美国蔬菜和植物种子公司:Burpee
2017/02/01 全球购物
英国网上购买门:Direct Doors
2018/06/07 全球购物
屈臣氏泰国官网:Watsons TH
2021/02/23 全球购物
信号量和自旋锁的区别?如何选择使用?
2015/09/08 面试题
政法大学毕业生自荐信范文
2014/01/01 职场文书
读书演讲主持词
2014/03/18 职场文书
农村产权制度改革实施方案
2014/03/21 职场文书
销售求职信范文
2014/05/26 职场文书
铣床操作工岗位职责
2014/06/13 职场文书
2016年清明节期间群众祭祀活动工作总结
2016/04/01 职场文书