Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Linked list implementation in JavaScript

  • Loading branch information...
commit a838f3eb1d2be670cc15c40b67333bbb098f7629 1 parent 04a7cd4
Nicholas C. Zakas authored
View
19 LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2009 Nicholas C. Zakas. All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
View
57 data-structures/linked-list.htm
@@ -0,0 +1,57 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+
+<html>
+ <head>
+ <title>Linked List Example</title>
+ <script language="javascript" type="text/javascript" src="linked-list.js"></script>
+ </head>
+ <body>
+ <h2>Linked List Example</h2>
+ <hr />
+ <p>This example shows the usage of the linked list implementation.</p>
+ <script>
+
+//test creating the linked list
+var list = new LinkedList;
+
+//test the add method
+list.add("red");
+list.add("orange");
+list.add("yellow");
+list.add("green");
+list.add("blue");
+list.add("indigo");
+list.add("violet");
+
+//test the toString() method
+document.write("<p><b>Original List: </b><br />" + list + "</p>");
+
+//test the item() method
+document.write("<p><b>Value of node at position 2: </b><br />" + list.item(2) + "</p>");
+
+//test the remove() method
+list.remove(2);
+document.write("<p><b>After removing node at position 2: </b><br />" + list + "</p>");
+
+list.remove(0);
+document.write("<p><b>After removing node at position 0: </b><br />" + list + "</p>");
+
+//test the toArray() method
+var array = list.toArray();
+
+document.write("<p><b>New Array from toArray() method: </b><br />" + array + "</p>");
+
+//prove that the Array is actually a JavaScript Array object by sorting it
+array.sort();
+
+document.write("<p><b>Sorted Array from toArray() method: </b><br />" + array + "</p>");
+
+//try emptying the list
+while (list.size()){
+ list.remove(0);
+}
+
+document.write("<p><b>List after removing all: </b><br />" + list + "</p>");
+ </script>
+ </body>
+</html>
View
202 data-structures/linked-list.js
@@ -0,0 +1,202 @@
+/*
+ * Linked List implementation in JavaScript
+ * Copyright (c) 2009 Nicholas C. Zakas
+ * See LICENSE for details on license.
+ */
+
+//=================================================================
+// LinkedListNode Implementation
+//=================================================================
+
+//-----------------------------------------------------------------
+// Class LinkedListNode
+//-----------------------------------------------------------------
+// Author(s)
+// Nicholas C. Zakas (NCZ), 9/5/02
+//
+// Description
+// A linked list data node.
+//
+// Arguments
+// vData (Variant) - the data to store in the node.
+//-----------------------------------------------------------------
+function LinkedListNode(vData) {
+ this.data = vData; //the data for this node
+ this.next = null; //pointer to next node in the list
+}
+
+//=================================================================
+// LinkedList Implementation
+//=================================================================
+
+/**
+ * A linked list implementation in JavaScript.
+ * @class LinkedList
+ * @constructor
+ */
+function LinkedList() {
+
+ /**
+ * The number of items in the list.
+ * @property _length
+ * @type int
+ * @private
+ */
+ this._length = 0;
+
+ /**
+ * Pointer to first item in the list.
+ * @property _list
+ * @type Object
+ * @private
+ */
+ this._list = null;
+}
+
+LinkedList.prototype = {
+
+ //restore constructor
+ constructor: LinkedList,
+
+ /**
+ * Appends some data to the end of the list. This method traverses
+ * the existing list and places the value at the end in a new item.
+ * @param {variant} data The data to add to the list.
+ * @return {Void}
+ * @method add
+ */
+ add: function (data){
+
+ //create a new item object, place data in
+ var item = {
+ data: data,
+ next: null
+ },
+
+ //used to traverse the structure
+ current,
+ previous;
+
+ //special case: no items in the list yet
+ if (this._list === null){
+ this._list = item;
+ } else {
+ previous = this._list;
+ current = this._list.next;
+
+ while(current){
+ previous = current;
+ current = current.next;
+ }
+
+ previous.next = item;
+ }
+
+ //don't forget to update the count
+ this._length++;
+
+ },
+
+ /**
+ * Retrieves the data in the given position in the list.
+ * @param {int} index The zero-based index of the item whose value
+ * should be returned.
+ * @return {variant} The value in the "data" portion of the given item
+ * or null if the item doesn't exist.
+ * @method item
+ */
+ item: function(index){
+
+ //check for out-of-bounds values
+ if (index > -1 && index < this._length){
+ var current = this._list,
+ i = 0;
+
+ while(i++ < index){
+ current = current.next;
+ }
+
+ return current.data;
+ } else {
+ return null;
+ }
+ },
+
+ /**
+ * Removes the item from the given location in the list.
+ * @param {int} index The zero-based index of the item to remove.
+ * @return {variant} The data in the given position in the list or null if
+ * the item doesn't exist.
+ * @method remove
+ */
+ remove: function(index){
+
+ //check for out-of-bounds values
+ if (index > -1 && index < this._length){
+
+ var current = this._list,
+ previous,
+ i = 0;
+
+ //special case: removing first item
+ if (index === 0){
+ this._list = current.next;
+ } else {
+
+ //find the right location
+ while(i++ < index){
+ previous = current;
+ current = current.next;
+ }
+
+ //skip over the item to remove
+ previous.next = current.next;
+ }
+
+ //decrement the length
+ this._length--;
+
+ //return the value
+ return current.data;
+
+ } else {
+ return null;
+ }
+
+ },
+
+ /**
+ * Returns the number of items in the list.
+ * @return {int} The number of items in the list.
+ * @method size
+ */
+ size: function(){
+ return this._length;
+ },
+
+ /**
+ * Converts the list into an array.
+ * @return {Array} An array containing all of the data in the list.
+ * @method toArray
+ */
+ toArray: function(){
+ var result = [],
+ current = this._list;
+
+ while(current){
+ result.push(current.data);
+ current = current.next;
+ }
+
+ return result;
+ },
+
+ /**
+ * Converts the list into a string representation.
+ * @return {String} A string representation of the list.
+ * @method toString
+ */
+ toString: function(){
+ return this.toArray().toString();
+ }
+};
Please sign in to comment.
Something went wrong with that request. Please try again.