zoukankan      html  css  js  c++  java
  • 【javascript】数据结构-链表

    // 创建一个链表
    function LinkedList(){
    
    	// 创建一个Node辅助类,表示需要加入列表的项,它包含一个element属性,即表示需要加入到列表中的值,next属性表示指向下一个节点项目的指针
    	let Node = function(element){
    		this.element = element;
    		this.next = null;
    	};
    
    	// 长度初始化为0,列表头部初始化为空
    	let length = 0;
    	let head = null;
    
    	// append方法,向链表尾部追加元素
    	this.append = function(element){
    		let node = new Node(element),
    			current;
    		
    		// 列表中的第一个节点
    		if(head == null){
    			head = node;
    		}
    
    		else{
    			current = head;
    			// 循环列表,直到找到最后一项
    			while(current.next){
    				current = current.next;
    			}
    			// 找到最后一项,将next值赋给node,建立链接
    			current.next = node;
    		}
    		// 更新列表长度
    		length++;
    	};
    
    	// insert方法,向列表的特定位置插入一个新的项
    	this.insert = function(position, element){
    		// 检查越界值
    		if(position >=0 && position <=length){
    
    			// current是对插入元素之后的元素的引用,previous是对插入元素之前的元素的引用
    			let node = new Node(element),
    				current = head,
    				previous,
    				index = 0;
    
    			// 在第一项位置添加
    			if(position === 0){
    				node.next = current;
    				head = node;
    			}
    
    			else{
    				while(index++ < position){
    					previous = current;
    					current = current.next;
    				}
    				node.next = current;
    				previous.next =node;
    			}
    			// 更新列表长度
    			length++;
    			return true;
    		}
    		else{
    			return false;
    		}
    	};
    
    	// removeAt方法:从链表特定位置移除一项
    	this.removeAt = function(position){
    		// 检查越界值
    		if(position > -1 && position < length){
    			let current = head,
    				previous,
    				index = 0;
    
    			// 移除第一项
    			if(position === 0){
    				head = current.next;
    			}
    
    			else{
    				while(index++ < position){
    					previous = current;
    					current = current.next;
    				}
    				// 将previous与current的下一项链接起来,跳过current从而移除它
    				previous.next = current.next;
    			}
    			// 更新列表长度
    			length--;
    			return current.element;
    		}
    		else{
    			return null;
    		}
    	};
    
    	// remove方法:从列表中移除一项
    	this.remove = function(element){
    		let index = this.indexOf(element);
    		// 调用removeAt()方法
    		return this.removeAt(index);
    	};
    
    	// indexOf方法:返回元素在列表中的索引,如果没有该元素则返回-1;
    	this.indexOf = function(element){
    		let current = head,
    			index = 0;
    
    		while(current){
    			if(element === current.element){
    				return index;
    			}
    			index++;
    			current = current.next;
    		}
    
    		return -1;
    	};
    
    	// isEmpty方法,如果链表中不包含任何元素,则返回true,否则返回false
    	this.isEmpty = function(){
    		return length === 0;
    	};
    
    	// size方法,返回链表中包含的元素个数,与数组的length属性类似
    	this.size = function(){
    		return length;
    	};
    
    	// getHead方法:返回链表第一个元素
    	this.getHead = function(){
    		return head;
    	};
    
    	// toSting方法,由于链表使用了Node类,重写了javascript的toString方法,让其只输出元素的值
    	this.toString = function(){
    		let current = head,
    			string = '';
    
    		while(current){
    			string += current.element + (current.next ? ',':'');
    			current = current.next;
    		}
    		return string;
    	};
    
    	// print方法,用于在控制台输出链表元素
    	this.print = function(){
    		console.log(this.toString());
    	};
    }
    
    // 链表的使用
    var lnkst = new LinkedList();
    
    // 打印链表长度
    console.log(lnkst.size());
    
    // 给链表添加元素
    lnkst.append(1);
    lnkst.append(2);
    lnkst.append(3);
    lnkst.append(4);
    lnkst.append(5);
    
    // 调用打印方法
    lnkst.print();			//输出1,2,3,4,5
    
    // 插入元素
    lnkst.insert(2,'a');
    lnkst.print();			//输出1,2,a,3,4,5
    
    // 按位置删除元素
    lnkst.removeAt(2);
    lnkst.print();			//输出1,2,3,4,5
    
    // 按值删除元素
    lnkst.remove(5);
    lnkst.print();			//输出1,2,3,4
    
    //判断是否为空
    console.log(lnkst.isEmpty());		//false
    
    // 获取头部;
    console.log(lnkst.getHead());		//1
    

      

  • 相关阅读:
    linux execl()函数 关于execl()函数族的用法不在赘述,
    mysql日期格式化
    JavaScript超越了Java,c,python等等成为Stack Overflow上最热门的
    GO语言web框架Gin之完全指南
    计算机专业四年本科的课程表是什么样的?
    文化常识大全201901 普通老百姓交的朋友谓“布衣之交”
    JavaScript超越了Java,c,python等等成为Stack Overflow上最热门的
    linux bash吧,还有啥Bourne Again Shell
    TCP、UDP服务器模型 在网络程序里面,通常都是一
    SpringMVC常见面试题总结(超详细回答)
  • 原文地址:https://www.cnblogs.com/dragonir/p/7705005.html
Copyright © 2011-2022 走看看