// 封装链表
function LinkedList(){
// 创建一个內部类,用于存节点的数据和指针
function Node(data){
this.data = data;
this.next = null;
}
// 链表头
this.head = null;
// 链表长度
this.length = 0;
// ---------------------方法------------------
// append 向链表结尾追加一个节点
LinkedList.prototype.append = function(data){
var newNode = new Node(data);
if(!this.length){
this.head = newNode;
}else{
var current = this.head;
while(current.next){
current = current.next
}
current.next = newNode
}
this.length += 1
}
// toString
LinkedList.prototype.toString = function(){
var current = this.head;
var str = '';
while(current){
str += current.data + ' ';
current = current.next;
}
return str
}
// insert 向链表中插入一个节点
LinkedList.prototype.insert = function(position,data){
// 位置越界处理
if(position < 0 || position > this.length) return false;
// 创建新节点
var newNode = new Node(data);
// 插入头部
if(position == 0){
newNode.next = this.head;
this.head = newNode;
return true
}
// 插入其它位置
let index = 0;
let current = this.head;
let previous = null;
while(index++ < position){
previous = current;
current = previous.next;
}
previous.next = newNode;
newNode.next = current;
this.length++;
return true
}
// get 获取某个节点的信息
LinkedList.prototype.get = function(position){
// 越界处理
if(position < 0 || position >= this.length) return null;
// 获取
let index = 0;
let current = this.head;
while(index++ < position){
current = current.next;
}
return current.data
}
// indexOf 通过元素返回对应的索引,没有的话返回-1
LinkedList.prototype.indexOf = function(data){
if(!this.length) return -1;
let index = 0;
let current = this.head;
while(current){
if(current.data === data){
return index
}
current = current.next;
index++;
}
return -1
}
// update 修改某个节点的信息
LinkedList.prototype.update = function(position,newData){
// 位置越界处理
if(position < 0 || position >= this.length) return false;
// 修改头部节点
if(position == 0){
this.head.data = newData;
return true
}
// 修改其它节点
let current = this.head;
let index = 0;
while(index++ < position){
current = current.next
}
current.data = newData;
return true
}
// removeAt 通过索引删除相应的节点
LinkedList.prototype.removeAt = function(position){
// 位置越界处理
if(position < 0 || position >= this.length) return null;
let current = this.head;
// 删除头部节点
if(position == 0){
this.head = this.head.next;
return current.data
}
// 删除其它节点
let previous = null;
let index = 0;
while(index++ < position){
previous = current;
current = previous.next;
}
previous.next = current.next;
this.length--;
return current.data
}
// remove 通过元素删除相应的节点
LinkedList.prototype.remove = function(data){
// 头部节点删除
if(this.head.data === data){
this.head = this.head.next;
return true
}
// 删除其它节点
let current = this.head;
let previous = null;
while(current){
previous = current;
current = previous.next;
if(current && current.data === data){
previous.next = current.next;
this.length--;
return true
}
}
return false
}
// isEmpty 判断链表是否为空
LinkedList.prototype.isEmpty = function(){
return this.length == 0
}
// size 查看链表的长度
LinkedList.prototype.size = function(){
return this.length
}
}
// 测试
let list = new LinkedList();
list.append('caoCao')
list.append('liuBei')
list.append('zhangFei')
console.log(list);
console.log(list.toString());
list.insert(2,'hei')
console.log(list);
console.log(list.toString());
console.log(list.get(2));
console.log(list.indexOf('hei'));
console.log(list.update(3,'美女'));
console.log(list.toString());
console.log(list.removeAt(2));
console.log(list.toString());
console.log(list.remove('美女'));
console.log(list.toString());
console.log(list.isEmpty());
console.log(list.size());