目录
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总结
链表是一种物理存储单元上非连续、非顺序的存储结构,
数据元素的逻辑顺序是通过链表中的指针链接次序实现的。
链表由一系列结点(链表中每一个元素称为结点)组成,
结点可以在运行时动态生成。
每个结点包括两个部分:
一个是存储数据元素的数据域,
另一个是存储下一个结点地址的指针域。
head用作指向第一个元素的指针(引用)
node里面的value代表数据,next代表指向下一项的指针
当node.next指向的为空时,代表此时的node为最后一个元素
链表的最后一个元素,他的next指向一定是undefined
使用链表存储数据,比数组好。
为什么这么说。
数组有一个缺点,就是他的大小固定,
向里面插入数据或者删除时,需要移动元素。
成本较高,而链表只需要改变指针的指向就可以了。
注意:
访问链表的元素,必须从链表的起点(表头)
开始迭代链表。直到访问到指定的元素。
我们还是用对象的形式来模拟链表。在创建
链表的时候我们需要定义两个辅助工具。
一个用于检查传入的元素是否与链表中的
元素是否相等,另一个用于创建一个新节点。
检查相等:
function defaultEquals(a,b){
return a===b
}
创建一个新节点(node):
class Node{
constructor(element){
this.element=element
this.next=undefined
}
}
完整的链表结构:
向一个链表插入一个元素,记住是在尾部
插入元素,插入其他位置的函数在下面解释。
那么我们就需要考虑,插入尾部时,就会有两种
情况,一个就是链表为空,添加的元素就是第一个元素
还有一种就是向链表的尾部插入元素。
在这里我们用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++
}
}
removeAt(index)用于移除指定位置的元素。
那么首先需要链表不为空,之后就是考虑移除
元素的位置,如果是第一个元素,我们只要将head
指向下一个元素,如果是其他位置时,需要判断移除
元素的合法性(大于0),在这里我们引入一个变量
previous用于标记当前元素的前一个位置。
只需要将previous指向于当前元素的先一个元素
removeAt(index){
if(index>=0&&index
getElement(index)用于得到指定位置的值,
为此我们需要迭代链表,直到循环到指定的
位置
getElementAt(index){
if(index>=0&&index
isEmpty()和size()实现这两个方法就比较简单
判断一下count就行了
代码:
isEmpty(){
return this.count===0
}
size(){
return this.count
}
用于将链表对象转化为字符串。如果链表
为空,返回空字符串,不为空迭代所有的元素
将元素值添加字符串。
toString(){
if(this.head==null){
return ""
}
let objString=`${this.head.element}`
let current=this.head.next
for (let i=1;i
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))
1.学会了链表的一些基本概念。
2.掌握了链表的一些方法,以及源码书写
✍在最后,如果觉得博主写的还行,
期待点赞 评论 收藏