数据结构——链表基础

链表:
单向链表用js实现
简单来说,链表就是能够指向内存当中的不连续的空间。
下面简单用js实现一下链表中的一些常用的方法:

// 创建一个node,一个节点中包含data和next指针
class Node{
	constructor(element) {
		this.element = element
		this.next = null
	}
}
// 链表序列
class LinkedList {
	constructor() {
		this.size = 0
		this.head = null
	}
	// 追加链表(追加到最前面或者是最后面),***************************
	// 追加链表是按照节点的方式追加把数据存到data中,然后插入节点
	append(element) {
		let node = new Node(element)
		// 加到最前面(判断加到前边的方法:1.head指向的是null,2.或者链表的长度为0即:this.size===0)
		if(this.head===null) {
			this.head = node // head指向这个节点
		} else {
			// 添加到最后面
			let current = this.getNode(this.size - 1)
			current.next = node
		}
		this.size++
	}
	// 指定位置追加链表********************************************
	/**
	* 在指定位置插入元素,位置可能是链表的最前边或者是中间的某个位置,我们需要先做位置的
	* 越界处理。
	* 在最前边的插入position=0
	* 在中间某处的插入,是这样的过程:我们需要找到position位置的前一个节点或是后一个节点,
	* 通过将前一个节点的next指向插入元素即可
	*/
	appendAt(position, element) {
		if(position < 0 || positon > this.size) {
			throw new Error('位置越界')
		}
		let node = new Node(elemnet)
		// 在起始位置插入
		if(position===0) {
			node.next = this.head // 将我们创建的node的next指针指向原来链表的第一个位置的元素
			this.head = node // 将链表的head指向新的链表的第一个位置即:我们插入的元素的位置
		} else {
		// 在中间位置插入
			let pre = this.getNode(position-1)
			node.next = pre.next // 此处先赋值目的是为了将前一个元素的next保存起来
			pre.next = node
		}
		this.size++
	}
	// 指定位置删除某一节点*******************************************
	removeAt(position) {
		if(position < 0 || position >= this.size) {
			throw new Error('坐标越界')
		}
		let current = this.head
		if(position===0) {
			this.head = current.next // 当删除的是第一个位置的节点,那么,就将head指向当前删除的节点的next所指向的元素
		}else {
		/**
		*此处删除的是某一个位置的元素,过程:我们拿到position这个下标元素的前一个元素pre,
		*那么此时这个下标元素current就是pre的next所指向的元素,然后我们删除当前元素,那么其上
		*一个元素的next就会是指向当前元素的next所指向的元素
		*/
			let pre = this.getNode(position-1)
			current = pre.next
			pre.next = current.next
		}
		this.size--
	}
	// 查找指定元素的索引****************************************************
	/**
	* 查找下标就比较简单了,通过对链表的元素进行循环,然后让其和传入的元素进行比对,相同的话
	* 会返回其下标current = current.next 是为了让当前元素一致是往下走的
	*/
	indexOf(element) {
		let current = head
		for(var i = 0; i < this.size; i++) {
			if(current.element===element) {
				return i
			}
			current = current.next
		}
		return -1 // 如果没有找到就返回-1
	}
	//获取链表的某一个元素
	getNode(index) {
		if(index < 0 || index >= this.size) {
			throw new Error('越界')
		}
		let current = this.head
		for(var i = 0; i < index; i++){
			current = current.next
		}
		return current
	}
}
用的话就是:
let myLink = new LinkedList()
myLink.append(item)
myLink.appendAt(2,item)
... ...

链表的话还是看图会比较容易理解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值