使用JavaScript实现单向链表

一、实现功能

  1、链表元素头部插入 this.unShift = function(data) {}

  2、链表元素尾部插入 this.append= function(data) {} //返回boolean

  3、链表元素按位置插入 this.insert= function(position, data) {} //返回boolean

  4、链表元素头部删除 this.shift= function() {} //返回boolean

  5、链表元素尾部删除 this.pop = function() {} //返回boolean

  6、链表按元素删除 this.removeData = function(data) {} //返回boolean

  7、链表按下标删除 this.removePos = function(position) {} //返回boolean

  8、链表是否为空 this.isEmpty= function() {} //返回boolean

  9、链表元素组成的字符串 this.toString= function() {} //返回 string

  10、链表的长度 this.length= function() {} //返回number

  11、链表查找元素 this.searchData= function(data) {}  //返回obj={index:,data:}

二、节点声明

function Node(data) {
	this.data = data  //数据
	this.next = null  //指向
}

三、完整功能代码

function List() {
	let length = 0
	let head = null
	this.append = (data) => { // 向链表末尾添加元素
		let node = new Node(data)
		let current
		if(head === null) {
			head = node
		}
		else {
			current = head
			while(current.next) {
				current = current.next
			}
			current.next = node
		}
		length ++
		return true
	}
	this.insert = (position, data) => { // 向链表指定位置添加元素
	    if (position >= 0 && position <= length) { //检查是否越界
	        let node = new Node(data),
	            current = head,
	            previous,
	            index = 0
	        if (position === 0) { //在第一个位置添加
	            node.next = current
	            head = node
	        }else {
	            while (index ++ < position) {
	                previous = current
	                current = current.next
	            }
	            //通过改变指针,将node链接在previous和current之间
	            node.next = current
	            previous.next = node
	        }
	        length ++
	        return true
	    }else {
	        return false
	    }
	}
	this.removeData = (data) => { // 通过数据删除链表元素
		let previous,
			current,
			index = 0
		if (head === null) {
			return false
		}
		current = head
		while(index ++ < length && current.data !== data) {
			previous = current
			current = current.next
		}
		if(index > length) {
			return false
		}else {
			current.next = current.next
			length --
			return true
		}
	}
	this.removePos = (position) => { // 通过位置删除链表元素
		if( position >= -1 && position < length) {
			let previous,
				current = head,
				index = 0
			if (position === 0) {
				head = current.next
			}else {
				while(index ++ < position) {
					previous = current
					current = current.next
				}
				previous.next = current.next
			}
			length --
			return true
		}else {
			return false
		}
	}
	this.unShift = (data) => {  //向链表首插入元素
		let node = new Node(data),
			current = head
		node.next = current
		head = node
		length ++
		return true
	}
	this.shift = () => {  //删除链表首元素
		let current = head
		if(head === null) {
			return false
		}
		else {
			head = current.next
			length --
			return true
		}
	}
	this.pop = () => { // 删除链表尾元素
		let current,
			previous
		if (head === null){
			return false
		}
		current = head
		while(current) {
			previous = current
			current = current.next
		}
		previous = null
		length --
		return true
	}
	this.isEmpty = () => {
		return length === 0
	}
	this.length = () => {
		return length
	}
	this.searchData = (data) => { //查找元素
		let current,
			index = 0,
			obj = {}
		if( head === null ) {
			return false
		}
		current = head
		while(index ++ < length && current.data !== data) {
			current = current.next
		}
		obj = {
			index: index,
			data: current.data
		}
		return obj
	}
	this.toString = () => { //输出数据组成的字符串
		let resultStr = "",
			current,
			index = length
		if (head === null) {
			return ""
		}
		current = head
		while(index -- > 0) {
			resultStr += "," + current.data
			current = current.next
		}
		return resultStr.slice(1)
	}
}

四、测试代码及结果

  1、测试代码

<!DOCTYPE html>
<html>
<head>
	<title>test</title>
	<script type="text/javascript" src="./singleList.js"></script>
</head>
<body>
	<script type="text/javascript">
		let singleList = new List()
		console.log(singleList.append("1"))
		console.log(singleList.toString())
		console.log(singleList.append("2"))
		console.log(singleList.toString())
		console.log(singleList.append("3"))
		console.log(singleList.toString())
		console.log(singleList.unShift(0))
		console.log(singleList.toString())
		console.log(singleList.insert(2,"4"))
		console.log(singleList.toString())
		console.log(singleList.shift())
		console.log(singleList.toString())
		console.log(singleList.pop())
		console.log(singleList.toString())
		console.log(singleList.searchData("1"))
		console.log(singleList.removePos(1))
		console.log(singleList.toString())
		console.log(singleList.removeData("1"))
		console.log(singleList.toString())
		console.log(singleList.isEmpty())
	</script>
</body>
</html>

  2、测试结果

猜你喜欢

转载自www.cnblogs.com/detanx/p/JavaScriptLinkList.html