JavaScript 数据结构(6):双端链表 FirstLastList

/**
 * 双端链表(FirstLastList)
 */
 
/* Link 链表节点 */
function Link (data) {
	this.data = data;
	this.next = null;
}

Link.prototype.displayLink = function(){
	console.log(this.data);
};

/* FirstLastList 双端链表 */
function FirstLastList () {
	var first = null,		// 链表中的第一个链结点
		last = null,		// 链表中的最后一个链结点
		size = 0;
	
	return {
		insertFirst: function(data){		// 在表头插入一个结点
			var link = new Link(data);
			link.next = first;
			first = link;
			if(last === null){
				last = link;
			}
			size++;
		},
		insertLast: function(data){
			var link = new Link(data);
			if(last === null){
				first = last = link;
			}else{
				last.next = link;
				last = link;
			}
			size++;
		},
		deleteFirst: function(){		// 删除表头结点
			var link = null;
			
			if(size > 1){
				link = first;
				first = first.next;
				size--;
			}else if(size == 1){
				link = first;
				first = last = null;
				size--;
			}
			
			return link.data;
		},
		search: function(key){		// 根据指定值查找结点
			var current = first;
			
			while(current !== null){
				if(current.data === key){
					console.log('Find it!');
					return current.data;
				}
				current = current.next;
			}
			console.log('Can not find such a Link.');
			return null;
		},
		delete: function(key){		// 根据指定值删除结点
			var previous = null,
				current = first;
				
			while(current !== null){
				if(current.data === key){
					size--;
					
					console.log('Find and delete it!');
					if(current === first){
						first = current.next;
						return current.data;
					}else{
						previous.next = current.next;
						return current.data;
					}
					
					if(current === last){
						last = previous;
					}
				}

				previous = current;
				current = current.next;
			}
			console.log('Can not delete such a Link.');
			return null;
		},
		displayList: function(){		// 显示整个链表
			console.log('List(first --> last):')
			var current = first;
			while(current !== null){
				current.displayLink();
				current = current.next;
			}
		},
		size: function() {		// 链表长度
			return size;
		},
		isEmpty: function(){		// 判断链表是否为空
			return size === 0;
		}
	}
}


// 测试

var list = new FirstLastList();

list.insertLast(5);
list.insertLast(6);
list.insertLast(7);
list.displayList();

list.insertFirst(4);
list.displayList();

console.log(list.delete(6));
list.displayList();

console.log('Delete till list is empty:');
while(!list.isEmpty()){
	console.log(list.deleteFirst());
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值