因为比较简单,这里就不讲解思路了,我们直接用代码来实现这个方法
function LinkedList() {
//属性
this.head = null
this.length = 0
//每个元素的定义类
function Node(item) {
this.item = item
this.next = null
}
//获取元素的索引
LinkedList.prototype.indexOf = function (item) {
let current = this.head
let index = 0
while (index < this.length) {
if(current.item === item) {
return index
}
else {
current = current.next
index ++
}
}
return -1
}
}
我们来使用一下该方法
let linkedlist = new LinkedList()
linkedlist.append(‘javascript’)
linkedlist.append(‘python’)
linkedlist.append(‘java’)
linkedlist.indexOf(‘python’) //返回 1
linkedlist.indexOf(‘c++’) //返回 -1
update()
方法就是用于修改链表中某位置上的元素的值。因此该方法需要传入两个参数,第一个参数是 position
,表示需要修改的元素的索引;第二个参数是 NewItem
,表示修改后的值
这里就简单讲下思路吧,首先要先判断 position
是否越界,若越界直接返回 false
表示修改失败,若没有越界就遍历链表,同时记录当前索引 index
,当 index == position
时,就将当前索引位置上的元素的值 item
修改成 NewItem
接下来我们来单独实现一下该方法
function LinkedList() {
//属性
this.head = null
this.length = 0
//每个元素的定义类
function Node(item) {
this.item = item
this.next = null
}
//修改某位置上的元素
LinkedList.prototype.update = function (position, NewItem) {
// 1.判断是否越界
if(position < 0 || position >= this.length) return false
else {
let current = this.head
let index = 0
// 2.遍历链表,找到索引等于position的元素对象
while (index < position) {
current = current.next
index ++
}
// 3.将索引等于position的元素的值改为NewItem
current.item = NewItem
return true
}
}
}
我们来使用一下该方法
let linkedlist = new LinkedList()
linkedlist.append(‘javascript’)
linkedlist.append(‘python’)
linkedlist.append(‘java’)
linkedlist.update(2, ‘c++’)
此时的链表是这样的
removeAt()
方法就是用于移除链表中某位置上的某元素。该方法只需要传入一个参数 position
,表示需要移除元素的索引
实现思路:
-
判断
position
是否越界,若越界,则直接返回false
表示移除元素失败 -
若没有越界,判断
position
是否等于0
,若等于0
,则直接将链表第一个元素的next
值赋值给head
,然后length - 1
-
若
position
不等于0
,则遍历链表,同时记录当前索引index
,遍历的当前元素current
,current
的上一个元素prev
-
当
index === position
时,则将current
的next
值赋值给prev
的next
值即可,同时length - 1
为了让大家更好地理解该方法的实现思路,我制作了一个动图来帮助大家理解,如图
思路讲完了,我们直接来看代码
function LinkedList() {
//属性
this.head = null
this.length = 0
//每个元素的定义类
function Node(item) {
this.item = item
this.next = null
}
//移除某位置上的元素
LinkedList.prototype.removeAt = function (position) {
// 1.判断是否越界
if(position < 0 || position >= this.length) return false
let current = this.head
let prev = null
let index = 0
// 2.判断position是否等于 0
if(position === 0) {
this.head = current.next
}
else {
// 3.遍历链表
while (index < position) {
prev = current
current = current.next
index ++
}
// 4.移除对应元素
prev.next = current.next
}
// 5.链表元素 -1
this.length –
return true
}
}
我们来使用一下该方法
let linkedlist = new LinkedList()
linkedlist.append(‘javascript’)
linkedlist.append(‘python’)
linkedlist.append(‘java’)
linkedlist.removeAt(2) //返回 true
linkedlist.removeAt(3) //返回 false,表示删除失败
此时的链表是这样的
remove()
方法就是用于移除链表中的某元素,并返回被删除元素所在的索引位置,若链表中没有对应元素,则返回 false
。该方法需要传入一个参数 data
用于查找链表中对应的元素
实现思路:
-
利用上面封装的
indexOf()
方法,将data
作为参数传入,获取到data
在链表中的索引index
。 -
再利用上面封装的
removeAt()
方法,将index
作为参数传入,就可以实现remove()
方法的功能了。
我们简单来写一下代码实现该方法
function LinkedList() {
//属性
this.head = null
this.length = 0
//每个元素的定义类
function Node(item) {
this.item = item
this.next = null
}
//移除某元素
LinkedList.prototype.remove = function (data) {
// 1.获取data在链表中的索引
let index = this.indexOf(data)
// 2.利用removeAt()方法删除链表中的data
this.removeAt(index)
// 3.返回被删除元素data在链表中的索引
return index
}
}
我们来使用一下该方法
let linkedlist = new LinkedList()
linkedlist.append(‘javascript’)
linkedlist.append(‘python’)
linkedlist.append(‘java’)
linkedlist.remove(‘javascript’) //返回 0
此时链表是这个样子的
isEmpty()
方法就是判断链表中是否有元素。若有元素,则返回 false
;反之,返回 true
该方法的实现思路很简单,直接判断属性 length
是否等于 0
就可以了。
话不多说,我们赶紧写代码实现一下该方法
function LinkedList() {
//属性
this.head = null
this.length = 0
//每个元素的定义类
function Node(item) {
this.item = item
this.next = null
}
//判断链表是否为空
LinkedList.prototype.isEmpty = function () {
if(this.length === 0) {
return true
}
else {
return false
}
}
}
我们来使用一下该方法
let linkedlist = new LinkedList()
linkedlist.isEmpty() //返回 true,此时链表中无元素
linkedlist.append(‘javascript’)
linkedlist.append(‘python’)
linkedlist.append(‘java’)
linkedlist.inEmpty() //返回 false,此时链表中有三个元素
szie()
方法就是返回链表内的元素个数
我们来实现一下该方法
function LinkedList() {
//属性
this.head = null
this.length = 0
//每个元素的定义类
function Node(item) {
this.item = item
this.next = null
}
//返回链表的元素个数
LinkedList.prototype.size = function () {
return this.length
}
}
我们来使用一下该方法
let linkedlist = new LinkedList()
linkedlist.size() //返回 0,此时链表中无元素
linkedlist.append(‘javascript’)
linkedlist.append(‘python’)
linkedlist.append(‘java’)
linkedlist.size() //返回 3,此时链表中有三个元素
toString()
方法就是以字符串的形式展示链表内的所有元素
实现思路很简单,就是遍历链表中的每一个元素,并将每个元素以字符串的形式连接起来即可
我们来实现一下该方法
function LinkedList() {
//属性
this.head = null
this.length = 0
//每个元素的定义类
function Node(item) {
this.item = item
this.next = null
}
//展示整个链表
LinkedList.prototype.toString = function () {
let string = ‘’
let current = this.head
while (current) {
string += ${current.item}
current = current.next
}
return string
}
}
我们来使用一下该方法
小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注:前端)
总结
为了帮助大家更好温习重点知识、更高效的准备面试,特别整理了《前端工程师面试手册》电子稿文件。
内容包括html,css,JavaScript,ES6,计算机网络,浏览器,工程化,模块化,Node.js,框架,数据结构,性能优化,项目等等。
包含了腾讯、字节跳动、小米、阿里、滴滴、美团、58、拼多多、360、新浪、搜狐等一线互联网公司面试被问到的题目,涵盖了初中级前端技术点。
前端面试题汇总
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
JavaScript
性能
linux
总结
为了帮助大家更好温习重点知识、更高效的准备面试,特别整理了《前端工程师面试手册》电子稿文件。
内容包括html,css,JavaScript,ES6,计算机网络,浏览器,工程化,模块化,Node.js,框架,数据结构,性能优化,项目等等。
包含了腾讯、字节跳动、小米、阿里、滴滴、美团、58、拼多多、360、新浪、搜狐等一线互联网公司面试被问到的题目,涵盖了初中级前端技术点。
前端面试题汇总
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
JavaScript
性能
linux