单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始。 通过指针连接起来,但是只能单向遍历的内存块。由于它是单向的,或者说不可逆的,所以我们可以把它比作我们的人生:小学->中学->大学->工作->养老。
实现过程
var Node = function (data) { ?this.data = data; ?this.next = null;};var LList = function () { ?this.firstNode = null; ?this.lastNode = null; ?this.length = 0;};LList.prototype = { ?clear: function () { ???this.firstNode = null; ???this.lastNode = null; ???this.length = 0; ?}, ?get: function (position) { ???var currentNode = this.firstNode; ???for (var i = 1; i < position + 1; i++) { ?????currentNode = currentNode.next; ???} ???return currentNode; ?}, ?isEmpty: function () { ???var result = false; ???if (this.length == 0 && this.firstNode == null) { ?????result = true; ???} ???return result; ?}, ?add: function () { ???if (arguments.length == 1) { ?????data = arguments[0]; ?????var newNode = new Node(data); ?????if (this.isEmpty()) { ???????this.firstNode = newNode; ?????} else { ???????this.lastNode.next = newNode; ?????} ?????this.lastNode = newNode; ?????this.length++; ?????return true; ???} else if (arguments.length == 2) { ?????var isSuccessful = true; ?????var position = arguments[0]; ?????var data = arguments[1]; ?????if (position < this.length + 1) { ???????var newNode = new Node(data); ???????if (this.isEmpty()) { ?????????this.firstNode = newNode; ?????????this.lastNode = newNode; ???????} else if (position == this.length) { ?????????this.lastNode.next = newNode; ?????????this.lastNode = newNode; ???????} else if (position == 0) { ?????????newNode.next = this.firstNode; ?????????this.firstNode = newNode; ???????} else { ?????????var nodeBefore = this.get(position - 1); ?????????var nodeAfter = nodeBefore.next; ?????????newNode.next = nodeAfter; ?????????nodeBefore.next = newNode; ???????} ???????this.length++; ?????} else { ???????isSuccessful = false; ?????} ?????return isSuccessful; ???} ?}, ?display: function () { ???var str = ‘‘; ???var currentNode = this.firstNode; ???while (currentNode != null) { ?????str += currentNode.data + ‘, ‘ ?????currentNode = currentNode.next; ???} ???str = str.substr(0, str.length - 2); ???console.log(str); ?}, ?remove: function (position) { ???var result = null; ???if (!this.isEmpty() && (position < this.length)) { ?????if (position == 0) { ???????result = this.firstNode.data; ???????this.firstNode = this.firstNode.next; ???????this.lastNode = null; ?????} else { ???????var nodeBefore = this.get(position - 1); ???????var nodeToRemove = nodeBefore.next; ???????var nodeAfter = nodeToRemove.next; ???????nodeBefore.next = nodeAfter; ???????result = nodeToRemove.data; ???????if (position == this.length - 1) { ?????????this.lastNode = nodeBefore; ???????} ?????} ?????this.length--; ???} ???return result; ?}, ?set: function (position, data) { ???var isSuccessfule = true; ???if (!this.isEmpty() && (position < this.length)) { ?????var desireNode = this.get(position); ?????desireNode.data = data; ???} else { ?????isSuccessfule = false; ???} ???return isSuccessfule; ?}, ?contains: function (data) { ???var found = false; ???var currentNode = this.firstNode; ???while (!found && (currentNode != null)) { ?????if (data === currentNode.data) { ???????found = true; ?????} else { ???????currentNode = currentNode.next; ?????} ???} ???return found; ?}, ?size: function() { ???return this.length; ?}, ?reverse: function() { ???var newList = new LList(); ???for(var i=this.length-1; i>=0; i--) { ?????newList.add(this.get(i).data); ???} ???return newList; ?}};
js 实现单向链表
原文地址:https://www.cnblogs.com/hua-shao/p/8906080.html