js数据结构与算法:链表

目录

1.链表初认识

1.1链表

1.2为什么使用链表

2.链表的各种方法

2.1搭建链表

2.2 push()

2.3 removeAt(index)

2.4 getElement(index)

2.5 isEmpty()和size()

2.6 toString()

3.使用链表并总结

3.1使用链表

3.2总结



js数据结构与算法:链表_第1张图片

1.链表初认识

1.1链表

链表是一种物理存储单元上非连续、非顺序的存储结构,

数据元素的逻辑顺序是通过链表中的指针链接次序实现的。

链表由一系列结点(链表中每一个元素称为结点)组成,

结点可以在运行时动态生成。

每个结点包括两个部分:

一个是存储数据元素的数据域,

另一个是存储下一个结点地址的指针域。

js数据结构与算法:链表_第2张图片

 head用作指向第一个元素的指针(引用)

node里面的value代表数据,next代表指向下一项的指针

当node.next指向的为空时,代表此时的node为最后一个元素

链表的最后一个元素,他的next指向一定是undefined

1.2为什么使用链表

使用链表存储数据,比数组好。

为什么这么说。

数组有一个缺点,就是他的大小固定,

向里面插入数据或者删除时,需要移动元素。

成本较高,而链表只需要改变指针的指向就可以了。

注意:

访问链表的元素,必须从链表的起点(表头)

开始迭代链表。直到访问到指定的元素。

2.链表的各种方法

2.1搭建链表

我们还是用对象的形式来模拟链表。在创建

链表的时候我们需要定义两个辅助工具。

一个用于检查传入的元素是否与链表中的

元素是否相等,另一个用于创建一个新节点。

检查相等:

function defaultEquals(a,b){
    return a===b
}

 创建一个新节点(node):

class Node{
    constructor(element){
        this.element=element
        this.next=undefined
    }
}

 完整的链表结构:

2.2 push()

向一个链表插入一个元素,记住是在尾部

插入元素,插入其他位置的函数在下面解释。

那么我们就需要考虑,插入尾部时,就会有两种

情况,一个就是链表为空,添加的元素就是第一个元素

还有一种就是向链表的尾部插入元素。

在这里我们用head来保存对第一个元素的引用

current来代表指向链表的项。用count来代表链表的长度

链表为空:

js数据结构与算法:链表_第3张图片

 当链表为空时,我们只需要将head的指向改变为node。

链表的最后一项的next一定时null(或者undefinded)

链表不为空时:

js数据结构与算法:链表_第4张图片

链表不为空迭代链表,判断next的指向。得到最后一个元素

将他的指向修改为指向插入的元素

 源码:

class Linklist{
    constructor(Equals){
        this.count=0
        this.head=undefined
        this.Equals=Equals
    }
    push(element){
        const node=new Node(element)
        let current
        if(this.head==null){
            this.head=node
        }
        else{
            current=this.head
            while(current.next!=null){
                current=current.next
            }
            current.next=node
        }
        this.count++
    }
}

2.3 removeAt(index)

removeAt(index)用于移除指定位置的元素。

那么首先需要链表不为空,之后就是考虑移除

元素的位置,如果是第一个元素,我们只要将head

指向下一个元素,如果是其他位置时,需要判断移除

元素的合法性(大于0),在这里我们引入一个变量

previous用于标记当前元素的前一个位置。

只需要将previous指向于当前元素的先一个元素

removeAt(index){
    if(index>=0&&index

2.4 getElement(index)

getElement(index)用于得到指定位置的值,

为此我们需要迭代链表,直到循环到指定的

位置

 getElementAt(index){
    if(index>=0&&index

2.5 isEmpty()和size()

isEmpty()和size()实现这两个方法就比较简单

判断一下count就行了

代码:

isEmpty(){
    return this.count===0
}
size(){
return this.count
}

2.6 toString()

用于将链表对象转化为字符串。如果链表

为空,返回空字符串,不为空迭代所有的元素

将元素值添加字符串。

toString(){
    if(this.head==null){
       return ""
     }
   let objString=`${this.head.element}`
   let current=this.head.next
   for (let i=1;i

3.使用链表并总结

3.1使用链表

const list=new Linklist()
list.push(23)
list.push(65)
list.push(45)
list.push(3)

console.log(list)
console.log(list.size())
console.log(list.isEmpty())
console.log(list.toString())
console.log(list.removeAt(2))
console.log(list.getElementAt(1))

js数据结构与算法:链表_第5张图片 

3.2总结

1.学会了链表的一些基本概念。

2.掌握了链表的一些方法,以及源码书写

✍在最后,如果觉得博主写的还行,

期待点赞  评论 收藏 

js数据结构与算法:链表_第6张图片

 

你可能感兴趣的:(js数据结构与算法,链表,数据结构,list)