使用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>
效果图如下: