JavaScript实现循环链表

Posted IT-nose

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaScript实现循环链表相关的知识,希望对你有一定的参考价值。

单链表地址:点我

一、循环链表

  节点的next指向下一个节点,节点的prev指向上一个节点

function loopList() {
	let length = 0,
		head = null,
		tail = null
	this.append = (data) => {
		let node = new Node(data),
			current
		if(head === null) {
			head = node
			tail = node
		}else {
			current = head
			while(current.next) {
				current = current.next
			}
			current.next = node
			tail = node
		}
		length ++
		return true
	}
	this.insert = (position, data) => {
		if(position > -1 && position <= length) {
			let node = new Node(data),
				current = head,
				previous
			if(position === 0) {
				if (!head) {
					head = node
					tail = node
				}else {
					node.next = current
					current.prev = node
					head = node
				}
			}
			else if(position === length) {
				current = tail
				current.next = node
				node.prev = current
				tail = node
			}
			else {
				while(index ++ < position) {
					previous = current
					current = current.next
				}
				previous.next = node
				node.prev = previous
				node.next = current
				current.prev = node 
			}
			length ++
			return true
		}else {
			return false
		}
	}
	this.removePos = function (position) {
	    //检查是否越界
	    if (position > -1 && position < length) {
	        var current = head,
	            previous,
	            index = 0

	        if (position === 0) { //移除第一项
	            head = current.next
	            if (length === 1) {
	                tail = null
	            }else {
	                head.prev = null
	            }
	        }else if(position === length - 1) {
	            current = tail
	            tail = current.prev
	            tail.next = null
	        }else {
	            while (index++ < position) {
	                previous = current
	                current = current.next
	            }
	            //将previous与current的下一项链接起来,跳过current,从而移除它
	            previous.next = current.next
	            current.next.prev = previous
	        }
	        length --
	        return true
	    }else {
	        return false
	    }
	}
	this.removeData = (data) => {
		if(head === null) {
			return false
		}
		else {
			let current = head,
				previous,
				index = 0
			if (length === 1 ) {
				if (current.data !== data) {
                	return false
				}else {
					head = null
					tail = null
					length --
					return true
				}
			}

			
			while (index ++ < length && current.data !== data) {
				previous = current
				current = current.next
			}
			if(index === length) {
				current = tail
	            tail = current.prev
	            tail.next = null
	            length --
				return true
			}
			if(index > length) {
				return false
			}else {
				previous.next = current.next
				current.next.prev = previous
				length --
				return true
			}
		}
	}
	this.toString = () => {
		let resultStr = "",
			current,
			index = length
		if(head === null) {
			return ""
		}else {
			current = head
			while(index -- > 0) {
				resultStr += "," + current.data
				current = current.next
			}
			return resultStr.slice(1)
		}
	}
}

function Node(data) {
	this.data = data
	this.next = null
	this.prev = null
}

  

以上是关于JavaScript实现循环链表的主要内容,如果未能解决你的问题,请参考以下文章

java-----循环链表

java-----循环链表

《链表》之带头双向循环链表

带头双向循环链表 代码实现 review

java实现单向循环链表

C语言教程“双向循环链表”学习总结及其代码实现