js实现双向链表

  1. 双向链表
function DoubelLinkedList() {
	let Node = function (ele){
		this.ele = ele;
		this.prev = null;
		this.next = null;
	}
	let length = 0, head = null;
	// 向尾部追加
	this.append = function(ele) {
		let node = new Node(ele),
			current, previous;
		if(!head) {
			head = node;
		} else {
			current = head;
			while(current) {
				previous = current;
				current = current.next;
			}
			previous.next = node;
			node.prev = previous;
		}
		length++;
		return true;
	}
	// 插入到指定的位置
	this.insert = function(position, ele) {
		if(position >= 0 && position < length) {
			let node = new Node(ele),
				current = head, previous, index = 0;
			if(position == 0) {
				if(!head) {
					head = node;
				} else {
					node.next = head;
					head.prev = node;
					head = node;
				}
			} else {
				while(index++ < position) {
					previous = current;
					current = current.next;
				}
				if(position != length) {
					node.next = current;
					current.prev = node;
				}
				previous.next = node;
				node.prev = previous;
			}
			length++;
			return true;
		} else {
			return false;	
		}
	}
	// 删除值为 ele 的元素
	this.removeAt = function(ele) {
		let current = head, previous, num = 0;
		if(current.ele == ele) {
			head = head.next;
		}
		previous = current;
		current = current.next;
		while(current) {
			if(current.ele == ele) {
				previous.next = current.next;
				if(current.next) {
					current.next.prev = previous;
				}
				current = current.next;
				length--;
				num++;
			} else {
				previous = current;
				current = current.next;	
			}
		}
		return num;
	}
	// 删除尾部
	this.remove = function() {
		if(length == 0) {
			return false;
		}
		let current = head, previous;
		if(length == 1) {
			head = null;
			length--;
			return current.ele;
		} 
		while(current.next) {
			previous = current;
			current = current.next;
		}
		previous.next = null;
		length--;
		return  current.ele;
	}
	// 获取当前元素的位置
	this.indexOf = function(ele) {
		let current = head, index = 0;
		while(current && index < length) {
			if(current.ele == ele) {
				return index;
			}
			current = current.next;
			index++;
		}
		return false;
	}
	// 是否为空
	this.isEmpty = function() {
		return length == 0;
	}
	// 链表长度
	this.size = funciton() {
		return this.length;
	}
	// 获取链表的值  toString
	this.toString = function() {
		let current = head, str;
		while(current) {
			str = str +current.ele + ' ';
			current = current.next;
		}
		return str;
	}
	// 获取头结点
	this.getHead = function() {
		return head.ele;
	}
	// 获取尾部结点
	this.getTail = function() {
		let current = head, previous;
		while(current) {
			previous = current;
			current = current.next;
		}
		return previous.ele;
	}
}
  1. 双向循环链表

概念:将双向链表的头尾指针相连即可。
特点:该链表可以从任意的一个节点的两个方向进行遍历。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值