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总结



1.链表初认识

1.1链表

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

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

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

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

每个结点包括两个部分:

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

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

 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来代表链表的长度

链表为空:

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

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

链表不为空时:

链表不为空迭代链表,判断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<this.count){
        let current=this.head
        if(index===0){
            this.head=current.next
        }else{
            let provious
            for(let i=0;i<index;i++){
                provious=current
                current=current.next
            }
            provious.next=current.next
        }
        this.count--
    return current.element
    }
    return undefined
  }

2.4 getElement(index)

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

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

位置

 getElementAt(index){
    if(index>=0&&index<this.count){
        let node=this.head
        for(let i=0;i<index&&node!=null;i++){
            node=node.next
        }
        return node
    }
    return undefined
  }
}

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<this.size()&&current!==null;i++){
        objString=`${ objString},${current.element}`
        current=current.next
     }
  return objString
}

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))

 

3.2总结

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

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

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

期待🍟点赞  🍬评论 🍪收藏 

 

  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

言不及行yyds

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值