这几天跟着代码随想录做了链表篇章的题目,总体来说对链表有了进一步的理解。
首先是JS中的链表节点定义方式:
定义节点对象,以构建函数的方式构建,里面包括节点的两个属性:值,以及下一个节点的指针
function ListNode(val, next) {
this.val = val;
this.next = next;
}
然后我们输入的都是数组,将数组转化为链表:
//定义将数组转换为链表函数,采用函数表达式的形式定义函数
var array2List = function(arr) {
if (!arr.length) return null; //如果数组长度为0,则返回null
var head = new ListNode(arr[0], arr[1]); //利用new关键字创建一个 头结点 对象
var list = head; //创建一个变量用来表示链表,先把第一个节点头结点加入到链表中
for (var i = 1; i < arr.length; i++) {
list.next = new ListNode(arr[i], arr[i + 1]); //将数组后面的数字加到链表中,也是利用创建节点对象的方式,但是这里只是一个个创建节点对象,并没有联系起来
list = list.next; //让链表节点移动起来,将节点连起来
}
return head; //返回链表,头结点即可
}
力扣里面都是核心代码模式,所以对于输入输出都需要自己再额外注意一下。(还需要探索)
移除链表元素:在一些需要对节点进行操作的题目中,创建虚拟头结点有助于题目求解。
//利用虚拟节点删除节点元素
var removeElements = function(head, val) {
const dummyNode = new ListNode(0, head); //定义一个虚拟头节点
var current = dummyNode; //将虚拟头结点加入到链表中
while (current.next) { //对链表的下一个节点的值进行判断(因为只能通过改变前一个节点来移除当前节点,如果下一个节点存在(从头结点开始)
if (current.next.val === val) { //如果下一个节点的值等于要删除的值
current.next = current.next.next; //删除就是指向下下个节点
} else {
current = current.next; //没有移动查找下一个
}
}
return dummyNode.next //返回头结点就可以返回整个链表了(不包括创建的虚拟头结点)
};
设计链表:这是一题考察链表基础知识比较全面的题目,包括了获取链表指定节点的数值,在链表的前面、后面以及中间插入值,以及删除指定节点。主要是对链表的长度,头节点尾节点进行更新操作,对于指定节点的位置进行逻辑判断。
//核心代码模式
//节点定义函数,设置值和指针属性
class LinkNode {
constructor(val, next) {
this.val = val;
this.next = next;
}
}
//所有操作围绕此链表的头尾节点以及链表长度考虑,每一步都要考虑
//创建链表 单链表 存储头尾节点和节点数
var MyLinkedList = function() {
this._size = 0; //初始值节点数为0
this._tail = null; //尾节点
this._head = null; //头结点
}