一、链表
1.单向链表
class Node {
constructor ( element ) {
this . element = element;
this . next = null ;
}
}
class LinkedList {
constructor ( ) {
this . size = 0 ;
this . head = null ;
}
append ( element ) {
let node = new Node ( element)
if ( this . head === null ) {
this . head = node
} else {
let current = this . getNode ( this . size - 1 )
current. next = node
}
this . size++
}
appendAt ( position, element ) {
if ( position < 0 || position > this . size) {
throw new Error ( "Position out range" )
}
let node = new Node ( element)
if ( position === 0 ) {
node. next = this . head
this . head = node
} else {
let pre = this . getNode ( position - 1 )
node. next = pre. next
pre. next = node
}
this . size++
}
remove ( position ) {
if ( position < 0 || position >= this . size) {
throw new Error ( "Position out range" )
}
let current = this . head
if ( position === 0 ) {
this . head = current. next
} else {
let pre = this . getNode ( position- 1 ) ;
current = pre. next
pre. next = current. next
}
this . size--
}
indexOf ( element ) {
let current = this . head
for ( let i = 0 ; i < this . size; i++ ) {
if ( current. element === element) {
return i
}
current = current. next;
}
return - 1
}
getNode ( index ) {
if ( index < 0 || index >= this . size) {
throw new Error ( "out range" )
}
let current = this . head
for ( let i = 0 ; i < index; i++ ) {
current = current. next;
}
return current
}
}
let l1 = new LinkedList ( )
l1. append ( 1 )
l1. append ( 2 )
l1. append ( 3 )
l1. append ( 4 )
l1. append ( 5 )
l1. append ( 6 )
console. dir ( l1, {
depth: 100
} )
2.双向链表
3.单向循环链表
class Node {
constructor ( element ) {
this . element = element;
this . next = null ;
}
}
class LinkedList {
constructor ( ) {
this . size = 0 ;
this . head = null ;
this . tail = null ;
}
append ( element ) {
let node = new Node ( element)
if ( this . head === null ) {
this . head = node
} else {
let current = this . getNode ( this . size - 1 )
current. next = node
}
this . tail = node
this . size++
}
appendAt ( position, element ) {
if ( position < 0 || position > this . size) {
throw new Error ( "Position out range" )
}
let node = new Node ( element)
if ( position === 0 ) {
node. next = this . head
this . head = node
} else {
let pre = this . getNode ( position - 1 )
node. next = pre. next
pre. next = node
}
this . size++
}
remove ( position ) {
if ( position < 0 || position >= this . size) {
throw new Error ( "Position out range" )
}
let current = this . head
if ( position === 0 ) {
this . head = current. next
} else {
let pre = this . getNode ( position- 1 ) ;
current = pre. next
pre. next = current. next
}
this . size--
}
indexOf ( element ) {
let current = this . head
for ( let i = 0 ; i < this . size; i++ ) {
if ( current. element === element) {
return i
}
current = current. next;
}
return - 1
}
getNode ( index ) {
if ( index < 0 || index >= this . size) {
throw new Error ( "out range" )
}
let current = this . head
for ( let i = 0 ; i < index; i++ ) {
current = current. next;
}
return current
}
}
let l1 = new LinkedList ( )
l1. append ( 1 )
l1. append ( 2 )
l1. append ( 3 )
l1. append ( 4 )
l1. append ( 5 )
l1. append ( 6 )
l1. appendAt ( 2 , 7 )
l1. remove ( 2 )
l1. tail. next = l1. head
console. dir ( l1, {
depth: 100
} )
console. log ( l1. indexOf ( 1 ) )
4.双向循环链表