js模拟链表---双向链表

本文介绍了一个简单的双向链表实现方法,包括插入、删除等基本操作,并通过实例展示了如何使用该双向链表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

双向链表: 每个元素,有一个 next(指向下一个元素)和一个prev(指向前一个元素)

		function dbLinkedList(){
			var length=0;
			var head = null;
			var tail = null;
			function getNode(ele){
				return {
					ele:ele,
					next:null,
					prev:null
				}
			}
			
			this.insert = function(pos,ele){
				if(pos >= 0 && pos <= length){
					var nodes = getNode(ele);
					var current = head;
					var  previous,index=0;
					if(pos == 0){
						if(!head){
							head = nodes;
							tail = nodes;
						}else{
							nodes.next = current;
							current.prev = nodes;
							head = nodes;
						}
					}else if(pos == length){
						current = tail;
						current.next = nodes;
						nodes.prev = current;
						tail = nodes;
					}else{
						while (index++ < pos){ 
						previous = current;
						current = current.next;
						}
						nodes.next = current; 
						previous.next = nodes;
						current.prev = nodes;
						nodes.prev = previous; 
					}
					length++;
					return true;
				}else{
					return false;
				}
			}
			
			this.append = function(ele){
				return this.insert(length,ele);
			}
			
			this.removeAt = function(pos){
				if(pos > -1 && pos < length){
					var current = head,
					previous,index=0;
					//移除第一项
					if(pos == 0){
						head = current.next;
						//如果只有一项,更新tail
						if(length == 1){
							tail = null;
						}else{
							head.prev = null;
						}
					}else if(pos == length-1){
						current = tail;
						tail = current.prev;
						tail.next = null;
					}else{
						while(index++ < pos){
							previous = current;
							current = current.next;
						}
						//前面的next,指向当前项的next,即干掉当前项
						previous.next = current.next;
						current.next.prev = previous; 
					}
					length--;
					return current.ele;
				}else{
					return null;
				}
			};
			this.indexOf = function	(ele){
					var current = head;
					var index = -1;
					while(current){
						index++;
						if(current.ele === ele){
							return index;
						}
						current = current.next;
					}
					return -1;
			};
			
			this.remove = function(ele){
					var index = this.indexOf(ele);
					return this.removeAt(index);
			};
			this.toString = function(){
					var current = head;
					var str = '';
					var index = 0;
					while(current){
						str = str + current.ele+"-"  + index + "\n";   
						index++;	
						current = current.next;
					}
					console.log(str);
			};
			this.size = function(){
				return length;
			};
			this.isEmpty = function(){
				return !length;
			}
			this.getHead = function(){
				return head;
			};
			
		}
		
		var list = new dbLinkedList();
	
		list.append("a");
		list.append("b");
		list.append("c");
		list.insert(2,"bgb");
		list.append("d");
		list.append("大大");
		list.toString();
		list.remove("c");
		list.toString();

  

转载于:https://www.cnblogs.com/muamaker/p/9198690.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值