JS之单向链表反转

本文探讨了单向链表这种数据结构,强调其内存地址可以不连续的特点,并介绍了如何构建Node节点类和List链表类。接着,文章展示了在JavaScript中实现链表反转的代码,包括链表类的基本操作。最后,作者指出学习链表有助于提升对指针的掌握,鼓励读者交流反馈。

浅谈单向链表

链表是一种数据结构,在内存地址中可以是不连续的,这也是链表和数组的区别之一。单向的意思就是链表的每一个节点都只有一个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;
	}
}

总结

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值