<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script>
class Node{
constructor(value){
this.value = value
this.next = null
this.pre = null
}
}
class LinkedList{
constructor(){
this.size = 0
this.head = null
}
findN(n){
let currentnode = this.head
while((n--)&&(currentnode.next)){
currentnode = currentnode.next
}
return currentnode
}
append(element){
let newnode = new Node(element)
if(this.head == null){
this.head = newnode
}else{
let currentnode = this.findN(this.size)
currentnode.next = newnode
}
this.size++
}
find(item){
//查找值为 item。、的节点
let currentnode = this.head
while(currentnode && currentnode.value!=item){
currentnode = currentnode.next
}
return currentnode
}
insert(item,element){
let currentnode = this.find(item)
if(!currentnode){
return "当前节点不存在"
}
let newnode = new Node(element)
newnode.next = currentnode.next
currentnode.next = newnode
this.size++
}
remove(item){
let n = this.checkN(item)
let nextnode = this.findN(n+1)
let prenode = this.findN(n-1)
prenode.next = nextnode
this.size--
}
checkN(item){
//查询第几个item
let currentnode = this.find(item)
if(!currentnode){
return -1
}
let res = this.head
let count = 0
while(res.value!=item){
res = res.next
count++
}
return count
}
isEmpty(){
// 判断链表是否为空
return this.size == 0
}
getLength(){
// 获取链表的长度
return this.size
}
clear(){
// 清空链表
this.head = null
this.size = 0
}
}
</script>
<script>
class DoubleNode extends Node{
constructor(element){
super(element)
}
}
class DoubleLinkedList extends LinkedList{
constructor(){
super()
this.tail = null
}
append(element){
const newnode = new DoubleNode(element)
if(this.head == null){
this.head = newnode
this.tail = newnode
newnode.pre = newnode
}else{
this.tail.next = newnode
newnode.pre = this.tail
this.tail = newnode
}
this.size++
}
insert(item,element){
let n = this.checkN(item)
let prenode = this.findN(n-1)
let nextnode = this.findN(n+1)
let newnode = new DoubleNode(element)
if(n == this.size){
this.tail = newnode
}
newnode.pre = prenode
newnode.next = nextnode
prenode.next = newnode
nextnode.pre = newnode
this.size++
}
remove(item){
let n = this.checkN(item)
let prenode = this.findN(n-1)
let nextnode = this.findN(n+1)
prenode.next = nextnode
nextnode.pre = prenode
this.size--
}
getHead(){
return this.head
}
getTail(){
return this.tail
}
}
let arr = new DoubleLinkedList()
</script>
</body>
</html>
1.链表定义
链表(linked list)是一种在物理上非连续、非顺序的数据结构,由若干个节点(node)所组成。
单向链表的每一个节点包含两部分,一部分是存放数据的变量data,另一部分是指向下一个节点的指针next。
双向链表比单向链表复杂一些,它的每一个节点除了拥有data和next指针,还拥有指向前置节点的prev指针。