美女面试官问我链表的CURD,我彻底懵圈了……

IT科技类资讯2025-11-05 11:49:2517683

一、美女面试基础

1、官问定义

链表是链表一种物理存储单元上非连续、非顺序的底懵存储结构,数据元素的美女面试逻辑顺序是通过链表中的指针链接次序实现的。

2、官问相关概念

一个完整的链表链表需要由以下几个部分组成:

头指针:一个普通的指针,它的底懵特点是永远指向链表第一个结点的位置。结点:节点包含三类:头结点、美女面试首元节点和其它节点。官问

(1)头结点(非必须):一个不存任何数据的链表空节点,通常作为链表的底懵第一个节点。

(2)首元结点:链表中第一个存有数据的美女面试节点称为首元结点。

(3)其它结点:链表中的官问其它结点。

3、链表结点包含内容

链表中每个节点包含两个部分:

数据域:存储数据元素本身。指针域:指向直接后续元素的指针。

二、服务器托管链表分类及相关操作

链表存在很多种类,下面重点讲述单向链表、双向链表的结点结构,以及其对应的CURD(添加、更改、查找、删除)。

1、 单向链表

对于单链表的相应编程,我们均按照默认头指针指向首元结点这样的结构进行代码实现。

(1)结点结构

结点作为链表的重要组成部分,其结构可用如下代码表示:

function ListNode(val, next) {

this.val = val;

this.next = next === undefined ? null : next;

}

扩展:如何根据一个数组创建链表。

function createLinkedList(arr) {

const head = new ListNode(arr[0]);

let current = head;

for (let i = 1; i < arr.length; i++) {

const node = new ListNode(arr[i]);

current.next = node;

current = current.next;

}

return head;

}(2)遍历(查找)

在链表中查找指定数据元素,其思路是从表头依次遍历表中节点,用被查找元素与各结点中存储的数据元素进行对比,直到对比成功或遍历至链表最末端的null。

// 查找

function selectVal(head, val) {

let current = head;

// 判断是否为null

while (current) {

// 判断是否对比成功

if (current.val === val) {

return current;

}

current = current.next;

}

return null;

}(3)添加

向链表中添加元素,根据添加位置不同,可分为3中情况:

插入到链表的头部。插入到链表中间的某个位置。插入到链表的站群服务器最末端,作为链表中最后一个数据元素。插入思想将新结点的next指针指向插入位置后的结点。将插入位置前结点的next指针指向插入结点。function insertVal(head, val, add) {

const newNode = new ListNode(add);

// 查找插入节点

const currentNode = selectVal(head, val);

if (!currentNode) {

return null;

}

// 1. 将新结点的next指针指向插入位置后的节点

newNode.next = currentNode.next;

// 2. 将插入位置前节点的next指针指向插入节点

currentNode.next = newNode;

return head;

}(4)删除

删除的元素的时候要注意链表的结构,注意有没有空值的头结点,有头结点的时候删除的时候就不需要判断删除的是不是第一个值,否则需要进行判断。

function delVal(head, val) {

// 当一个结点也不存在时,直接返回空

if (!head) {

return null;

}

// 如果删除的是第一个节点,直接将head指向第二个节点

if (head.val === val) {

head = head.next;

return head;

}

// 如果删除的不是第一个节点

let current = head;

// 找到待删除元素的前一个值

while (current.next && current.next.val !== val) {

current = current.next;

}

if (current.next) {

// 将删除结点的前一个结点的next值直接指向删除结点的云南idc服务商下一个节点

current.next = current.next.next;

}

return head;

}(5)更改

更新链表中的元素,只需要通过遍历找到存储此元素的节点,对节点中的数据域做更改操作即可。

function updateVal(head, val, newVal) {

let current = head;

while (current) {

if (current.val === val) {

current.val = newVal;

return head;

}

current = current.next;

}

return null;

}

2、 双向链表

单链表只有一个方向,从头结点到尾结点,双向链表指各个节点之间的逻辑关系是双向的,其结点结构和链表结构如下所示:

结点结构:

链表结构:

(1)结点结构

双向链表的节点结构相比于单向链表,多了一个prev属性,如下所示:

function ListNode(val, prev, next) {

this.val = val;

this.prev = prev === undefined ? null : prev;

this.next = next === undefined ? null : next;

}(2)遍历(查找)

双向链表的查找和单向链表的查找类似,都是遍历链表。

function selectVal(head, val) {

let current = head;

while (current) {

if (current.val === val) {

return current;

}

current = current.next;

}

return null;

}(3)添加

在某个节点后插入结点,其思想是:

找到该插入结点。将新结点的next指针指向插入位置后的结点。将新结点的prev指针指向插入位置的结点。将插入节点的next指针指向新结点。/

**

* 插入(在某个节点后插入)

*/

function insertVal(head, val, add) {

const newNode = new ListNode(add);

// 查找插入节点

const currentNode = selectVal(head, val);

if (!currentNode) {

return null;

}

// 1. 将新结点的next指针指向插入位置后的结点

newNode.next = currentNode.next;

// 2. 将新结点的prev指针指向插入位置的结点

newNode.prev = currentNode;

// 3. 将插入节点的next指针指向新结点

currentNode.next = newNode;

return head;

}(4)删除

双链表删除结点时,只需要遍历链表找到要删除的链表,然后将该链表从表中摘除即可。

(注:针对头指针直线的结点需要做特殊处理,否则head永远指向的是原始的第一个节点)。

/

**

* 删除

*

* 双链表删除结点时,只需要遍历链表找到要删除的链表,然后将该链表从表中摘除即可

*/

function delVal(head, val) {

let current = head;

while (current) {

if (current.val === val) {

if (current.next) {

current.next.prev = current.prev;

}

if (current.prev) {

current.prev.next = current.next;

} else {

// 针对头指针直线的结点需要做特殊处理,否则head永远指向的是原始的第一个节点

head = current.next;

}

return head;

}

current = current.next;

}

return null;

}(5)更改

更新链表中的元素,只需要通过遍历找到存储此元素的节点,对节点中的数据域做更改操作即可。

/

**

* 更新

*

* 更新链表中的元素,只需要通过遍历找到存储此元素的节点,对节点中的数据域做更改操作即可

*/

function updateVal(head, val, newVal) {

let current = head;

while (current) {

if (current.val === val) {

current.val = newVal;

return head;

}

current = current.next;

}

return null;

}
本文地址:http://www.bzve.cn/news/13a62499362.html
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

热门文章

全站热门

IBUS 是 linux 下的输入框架,框架内的各种输入法是 Ubuntu 默认的非英文输入方式。新安装的 Ubuntu 系统,假如选择了中文环境,系统首次联网成功后,会提示用户下载 IBUS 下的拼音和五笔输入码表并安装,但并不默认启用相应的输入法。下面就分享一下安装和启用 IBUS 中文输入法的经验。1、点击屏幕右上角 Panel 上的输入法指示器,选择“文本输入设置”。2、弹出如下图窗口,点击左下角的 “+” 号。3、在弹出的输入法列表里,选择一个汉语输入法,单击“添加”。这里选拼音。4、回到第二步的图,这时用红圈里的箭头,可以调整现有输入法的排列顺序;用蓝圈里的设置图标,可以设置诸如“双拼”之类的选项。黄圈里是调用的快捷键,默认是 Super (也就是键盘上的 windows 徽标键)+空格,假如想改的话,可以点击,然后按下自己想要的组合键(比如 Ctrl + 空格),即刻生效。下面绿框中的选项,设置输入法与程序窗口之间的对应选项,可以让当前输入法对所有程序有效,也可以只对当前程序有效,也就是说不同的程序可以与不同的输入法(或英文状态)对应。好了,这样就开启IBUS 中文输入法了,谢谢阅读,希望能帮到大家,请继续关注脚本之家,我们会努力分享更多优秀的文章。

肝了一夜的66道并发多线程面试题,你不来个666吗?

手机自动化测试IDE --手把手教你用Airtest模拟器来连接手机

Spring奇技淫巧之扩展点的应用

卧龙大数据(发挥数据的力量,卧龙大数据引领行业变革)

使用 Vue 开发的这 7 个 VS Code 插件万万不可错过!

4月份Github上热门的Python开源项目排行

构建Vue CLI插件的基本流程

友情链接

滇ICP备2023006006号-39