DSA__JS 学习随笔--链表

本文详细介绍了链表的数据结构,包括单向链表、双向链表和循环链表的实现。通过JavaScript代码展示了链表节点的定义以及插入、查找、删除和显示元素等基本操作。对于双向链表,还提供了反序显示元素的方法。此外,还讨论了循环链表的特点和操作。
摘要由CSDN通过智能技术生成

链表(Linked List)

链表是由一组节点组成的集合
每个节点都是用一个对象的引用指向它的后继,指向另一个节点的引用叫做链
数组元素靠它们的位置进行引用,链表元素则是靠相互之间的关系进行引用

链表的实现

//Node类
function Node(element) {
	this.element = element;
	this.next = null;
}
//LinkedList类
function LList() {
	this.head = new Node("head");
	this.find = find;
	this.insert = insert;
	this.remove = remove;
	this.display = display;

	function find(item) {
		let currNode = this.head;
		while(currNode.element != item) {
			currNode = currNode.next;
		}
		return currNode;
	}

	function insert(newElement, item) {
		let newNode = new Node(newElement);
		let current = this.find(item);
		newNode.next = current.next
		current.next = newNode;
	}
	function display() {
		let currNode = this.head;
		while(!(currNode.next === null)) {
			console.log(currNode.next.element);
			currNodec = currNode.next;
		}
	}
	function findPrevious() {
		let currNode = this.head;
		while(!(currNode.next === null) && 
			   (currNode.next.element !== item)) {
			currNode = currNode.next;
		}
		return currNode;
	}
	function remove(item) {
		let prevNode = this.findPrevious(item);
		if(!(prevNode.next === null)) {
			prevNode.next = prevNode.next.next;
		}
	}
}

双向链表

function Node(element) {
	this.element = element;
	this.next = null;
	this.previous = null;
}
function LList() {
	this.head = new Node("head");
	this.find = find;
	this.insert = insert;
	this.display = display;
	this.remove = remove;
	this.findLast = findLast;
	this.dispReverse = dispReverse;
	//反序显示双向链表中的元素
	function dispReverse() {
		let currNode = this.head;
		currNode = this.findLast();
		while(!(currNode.previous === null)) {
			console.log(currNode.element);
			currNode = currNode.previous;
		}
	}
	function findLast() {
		let currNode = this.head;
		while(!(currNode.next === null)) {
			currNode = currNode.next;
		}
		return currNode;
	}
	
	function remove(item) {
		let currNode = this.find(item);
		if(!(currNode.next === null)) {
			currNode.previous.next = currNode.next;
			currNode.next.previous = currNode.previous;
			currNode.next = null;
			currNode.previous = null;
		}
	}
	function display() {
		let currNode = this.head;
		while(!(currNode.next === null)) {
			console.log(currNode.next.element);
			currNode = currNode.next;
		}
	}
	function find(item) {
		let currNode = this.head;
		while(currNode.element !== item) {
			currNode = currNode.next;
		}
		return currNode;
	}
	function insert(newElement, item) {
		let newNode = new Node(newElement);
		let current = this.find(item);
		let nextNode = current.next;
		newNode.next = nextNode;
		newNode.previous = current;
    	if(nextNode !== null){
      		nextNode.previous = newNode;
    	}
    	current.next = newNode;
	}
}

循环链表

function LList() {
	this.head = new Node("head");
	this.head.next = this.head;
	this.find = find;
	this.insert = insert;
	this.display = display;
	this.findPrevious = findPrevious;
	this.remove = remove;
	
	function find(item) {
		let currNode = this.head;
		while(currNode.element != item) {
			currNode = currNode.next;
		}
		return currNode;
	}

	function insert(newElement, item) {
		let newNode = new Node(newElement);
		let current = this.find(item);
		newNode.next = current.next
		current.next = newNode;
	}
	function display() {
		let currNode = this.head;
		while(!(currNode.next === null) &&
			  !(currNode.next.element === "head")) {
			console.log(currNode.next.element);
			currNodec = currNode.next;
		}
	}
	function findPrevious() {
		let currNode = this.head;
		while(!(currNode.next === null) && 
			   (currNode.next.element !== item)) {
			currNode = currNode.next;
		}
		return currNode;
	}
	function remove(item) {
		let prevNode = this.findPrevious(item);
		if(!(prevNode.next === null)) {
			prevNode.next = prevNode.next.next;
		}
	}
}

参考:数据结构与算法JavaScript描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值