一、链表的基础操作
1、创建一个链表结构
链表有几个特点:
- 可以动态扩展空间(在js中,数组也是这样的,但是有的语言中数组的长度是固定的,不能动态添加,如c语言)
- 需要一个头节点
- 需要知道下一个节点的地址
可以将链表中的每个节点看成是一个对象,这个对象中有两个属性,一个是该节点的值,一个是该节点的下一个节点的地址(如果是双链表,还要添加前一个节点地址的属性)
2、增加节点
3、删除节点
二、JavaScript代码实现(SingleList.js)
//节点类
class Node{
constructor(data){
this.data = data; //表示节点的数据域
this.next = null; //指针域:指向当前节点的下一个节点
}
}
//单链表类
class SingleList {
constructor() {
this.size = 0; //单链表的长度
this.head = new Node("head"); //表头节点
this.currNode = ''; //当前节点指针
}
//判断链表是否为空
isEmpty() {
return this.size === 0;
}
//获取单链表的长度
getLength() {
return this.size;
}
//显示当前节点
showNode() {
console.log(this.currNode.data)
}
//遍历单链表
displayList() {
let result = '';
let currNode = this.head;
while(currNode) {
result += currNode.data;
currNode = currNode.next;
if(currNode){
result += '->';
}
}
console.log(result);
}
//获取单链表的最后一个节点
findLast() {
let currNode = this.head; //指向头节点
while(currNode.next) {
currNode = currNode.next;
}
return currNode; //返回最后一个节点
}
//在单链表中查找item元素
findNode(item) {
let currNode = this.head;
while(currNode && (currNode.data !== item)){
currNode = currNode.next;
}
return currNode;
}
//插入节点
insertNode(item,element) {
let itemNode = this.findNode(item);
if( !itemNode ){ //如果item元素不存在
return;
}
let newNode = new Node(element);
newNode.next = itemNode.next; //若currNode为最后一个节点,则currNode.next为空
itemNode.next = newNode;
this.size++;
}
//在单链表尾部添加元素
appendNode(element) {
let currNode = this.findLast();
let newNode = new Node(element);
currNode.prev = currNode.prev;
currNode.next = newNode;
this.size++;
}
}
module.exports.SingleLinkList = SingleList
三、测试代码:
var List = require('./SingleList')
let mylist = new List.SingleList();
let arr = [67,0,24,58];
for(let i=0; i<arr.length; i++){
mylist.appendNode(arr[i]);
}
mylist.displayList();
mylist.lastDisplay();