什么是链表:
链表存储有序的元素集合,组,链表中的元素在内存中并不是连续放置的。每个元素由一个存储元素本身的节点和一个指向下一个元素的引用(也称指针或链接)组成。
链表跟数组的区别 (只是简单叙述。)
链表的优点:
看图可以知道一个单向链表 是有一个 head属性 用来指向第一个节点 所以 this.head = newNode,然后 新节点 还有 两个属性分别是 itme 和next 所以实例化一个内部类(函数)。next用来指向下一个节点,此外还需要一个length 用来记录链表的长度。代码
//初始化一个 单项链表
function LinkedList(){
function Node(data,next){
this.data = data;
this.next = next;
}
this.head = null //默认为空
this.length = 0;
}
单向链表如果要新增一个 元素那么该如何添加呢? 有几种添加情况呢?
LinkedList.prototype.append = function(){
//链表内没有元素直接就可以 将传过来的数据 插入到 头顶 如何判断是不是第一个呢
let newNode = new Node(data,next)
if(this.length ==0){
this.head = newNode
}else {
//如果不是第一个元素那么就 直接从头开始遍历 到最后一个节点 用最后节点的 next 指向新元素
while(current.next){
current = current.next;
}
current.next = newNode;
this.length +1;
}
}
单向链表插入的话如何实现?插入也是有两种情况
LinkedList.prototype.append = function(position,data){
if (position < 0 || position > this.length) return false;
let newNode = new Node()
//判断插入的位置是否是第一个位置。
if(position==0){
newNode.next = this.head.next;
this.head = newNode;
}else {
let index = 0;
let current = this.head;
let prev = null;
while(index++ < positon){
prev = current
//current 一直遍历到当前要插入的位置。
current = current.next;
}
newNode.next = current
prev.next = newNode;
}
this.length +=1;
return true;
}
根据传入的位置移除位置的元素。
LinkedList.prototype.removeAt = function (position) {
//1.越界判断
if (position < 0 || position >= this.length) return null;
//2.判断是否删除的是第一个节点
let current = this.head;
if(position == 0){
this.head = this.head.next;
}else {
let index = 0;
let prev = null;
while(index++ < positon){
prev = current;
current = current.next;
}
prev.next = current.next;
}
this.length-=1;
}
LinkedList.prototype.update = function (position, newData) {
// 1.越界判断
if (position < 0 || position >= this.length) return false;
// 2.查找正确的节点
let current = this.head;
let index = 0;
while (index++ < position) {
current = current.next
}
// 3.将positon位置的node的data修改成新的newData;
current.data = newData;
return true;
}
LinkedList.prototype.toString = function () {
// 定义变量 current
let current = this.head;
let listString = "";
// 循环获取一个个的节点
while (current) {
listString += current.data + " "
current = current.next;
}
return listString
}
// 4. get方法
LinkedList.prototype.get = function (position) {
// 1.越界判断
if (position < 0 || position >= this.length) return false;
// 2.获取对应的data
let current = this.head;
let index = 0
while (index++ < position) {
current = current.next
}
return current.data;
}
// 5.indexOf 方法
LinkedList.prototype.indexOf = function (data) {
// 1.定义变量
let current = this.head
let index = 0;
// 2.开始查找
while (current) {
if (current.data == data) {
return index;
}
current = current.next;
index += 1;
}
// 3.找到最后没有找到,返回-1
return -1
}
// 8. remove 方法
LinkedList.prototype.remove = function (data) {
// 1.获取data 在列表中的位置
let position = this.indexOf(data);
// 根据位置信息 删除节点
return this.removeAt(position);
}
// 9. isEmpty方法
LinkedList.prototype.isEmpty = function () {
return this.length == 0;
}
// 10. size 方法
LinkedList.prototype.size = function () {
return this.length
}
}