JS之单向链表反转

12月22日 收藏 0 评论 1 前端开发

JS之单向链表反转

文章声明:转载来源:https://blog.csdn.net/qq_42885702/article/details/113730890

浅谈单向链表
链表是一种数据结构,在内存地址中可以是不连续的,这也是链表和数组的区别之一。
单向的意思就是链表的每一个节点都只有一个next指针,指向下一个节点,对比双向链表,它少了prev指针,指向上一个节点,因为节点与节点之间是用指针连接,所以内存地址可以是不连续的。

构建Node节点类
我们知道链表是由多个节点组成的,每个节点都有数据和next指针,下面我们就构建一个Node类:

class Node{
constructor(data_) {
//data的类型:{id: 'xxx', code: 'xxx'}
this.data = data_;
//这里next默认指向空
this.next = null;
}
}

构建List链表类
有了Node类,就可以构建List类了,List类的字段只需要一个header头指针就够了,下面实现List类一些常用的方法和反转功能,重要的地方会在代码中注释。

class List {
constuctor(head) {
//初始化的时候,将头指针指向头节点
this.header = head;
}

each(cb) {
//这里使用局部变量,拿到链表的头节点
//其作用是用来遍历链表,之后有很多相同操作不在赘述
let p = this.header;

while(p) {
cb(p);
//这里的是将p指向它的下一个节点,达到遍历的目的
p = p.next;
}
}

log() {
this.each((node) => {
console.log('data', node.data);
})
}

length_() {
let count = 0;

this.each((node) => {
count++;
})

return count;
}

add(node) {
let p = this.header;

//遍历链表中所有节点,直到找到最后一个节点
while(p.next) {
p = p.next;
}

p.next = node;
}

//反转的意思其实就是指针从指向下一个节点变为指向上一个节点
//头节点和尾节点调换
//需要注意的是尾节点的next指针一定指向null,否指就会形成闭环
//我的思路是用p、q、r三个指针分别指向三个节点,每一次循环
//都将q的next指针指回p,当q不存在时,p为尾节点
revert() {
let p = this.header;
let q = p.next;

while(q) {
//r指针的作用是保存p的next节点
let r = q.next;

q.next = p;
p = q;
q = r;
}

//此时header实际上是指向尾节点,所以将其next指向空
this.header.next = null;
//此时的p是原来链表的尾节点,反转后尾节点变为头节点
this.header = p;
}
}

总结
学习链表不仅可以帮助我们提高面试的能力,重要的是提升熟悉使用指针的能力,这里我只是实现了链表最基础简单的一些功能和我自己的一些理解,希望大家多多指正和评价,谢谢!

C 1条回复 评论
Amusi

太给力了 醍醐灌顶

发表于 2022-01-18 22:00:00
0 0