JavaScript实现基本链表

使用js实现了链表, 代码如下:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>链表</title>
	</head>
	<body>
		<script type="text/javascript">
			//创建一个基本的链表
			function List() {
				//链表组成有两个部分, 下一个对象next 上一个对象 head
				//初始化链表
				this.head = null
				this.length = 0
				// this.next = null
				function Node(data) {
					this.data = data
					this.next = null
				}
				//添加链表
				List.prototype.append = data => {
					let rul = new Node(data)
					if(this.length === 0) {
						this.head = rul
					}else {
						//进行判断, 如果他的next为空, 就为他的next指向下一个
						let current = this.head
						// console.log(current.next)
						while (current.next){
							current = current.next
						}
						current.next = rul
					}
					this.length +=1//++也可以, 一般来说, 有些语言不支持++
				}
				//toString方法
				List.prototype.toString = () => {
					//初始化
					let head = this.head 
					let str = ''
					while(head) {
						str += head.data + ',' //拼接
						head = head.next//一定要赋值, 不然会出现死循环
					}
					return str //返回字符串
				}
				//插入方法insrt
				List.prototype.insert = (posi, data) => {
					let newnode = new Node(data)
					//let head = this.head
					//如果在外面定义一个head = this.head 出出现意想不到的错误
					if(posi < 0 || posi > this.length) throw Error(' 越界')
					if(posi === 0) {
						newnode.next = this.head
						this.head = newnode
					}
					else {
						let upper = null//上一个
						let head = this.head//下一个
						for(let i = 0; i < posi; i++) {
							upper = head
							head = head.next
						}
						upper.next = newnode //上一个的下一个等于新节点
						newnode.next = head//新节点的下一个等于原本的正常下一个
					}
					this.length +=1
				}
				//get方法
				List.prototype.get = posi => {
					//越界判断
					if(posi < 0 || posi >= this.length) throw Error(' 越界')
					if(posi === 0) {
						//如果是第一个 直接返回第一个
						return this.head.data
					}else {
						let head = this.head
						for(let i =0; i<posi; i++) {
							//自增
							head = head.next
						}
						return head.data
					}
				}
				//updata方法
				List.prototype.updata = (posi, data) => {
					if(posi < 0 || posi >= this.length) throw Error(' 越界')
					if(posi === 0) {
						//如果是第一个, 直接赋值
						this.head.data = data
					}else {
						let head = this.head
						for(let i=0; i<posi; i++) {
							//自增
							head = head.next
						}
						//修改
						head.data = data
					}
				}
				//删除方法removeAt
				List.prototype.removeAt = posi => {
					if(posi < 0 || posi >= this.length) throw Error(' 越界')
					if(posi === 0) {
						//如果是第一个直接将第一个的next修改为第二个
						this.head = this.head.next
					}else {
						let head = this.head
						let upper = null
						for(let i=0; i<posi; i++) {
							//保留上一个节点, 然后自增
							upper = head
							head = head.next
						}
						//赋值
						upper.next = head.next
					}
					this.length -= 1
					return this.data
				}
				//indexOf方法
				List.prototype.indexOf = (data) => {
					//初始化下标
					let index = 0
					let head = this.head
					while(head) {
						if(head.data === data) {
							//如果找到了则返回下标
							return index
						}
						//内循环, 如果没有找到index就+1
						head = head.next
						index += 1
					}
					//如果没找到就返回-1
					return -1
				}
				//remove 方法
				List.prototype.remove = (data) => {
					//调用indexO的方法, 来实现获取下标
					let posi = this.indexOf(data)
					//调用removeAt的方法来删除元素
					this.removeAt(posi)
				}
				//isEmpty 方法
				List.prototype.isEmpty = () => this.length === 0
				//size方法
				List.prototype.size = () => this.length
			}
			let mylist = new List()
			mylist.append('啊哈哈哈哈')
			mylist.append('欸嘿嘿嘿嘿')
			console.log(mylist)
			console.log(mylist.toString())
			mylist.insert(0, '插入的数据1')
			mylist.insert(0, '插入的数据2')
			mylist.insert(0, '插入的数据3')
			console.log(mylist)
			console.log('----------------')
			mylist.insert(2, '插入的数据4')
			console.log(mylist)
			console.log(mylist.get(5))
			mylist.updata(2, '修改updata')
			console.log(mylist)
			console.log(mylist.toString())
			console.log(mylist.indexOf('啊哈哈哈哈'))
			mylist.removeAt(1)
			console.log(mylist)
			mylist.remove('啊哈哈哈哈')
			console.log(mylist)
			console.log(mylist.size())
			console.log(mylist.isEmpty())
		</script>
	</body>
</html>

效果图如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值