npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

simple-double-linked-list

v1.0.5

Published

I am a simple man. I don’t need any insane magic lists with thousands of lines of never used methods. I just need a light, easy to use and reliable double linked list with comfortable iterator. Do you want the same think? Well nice, because I made one!

Downloads

1,179

Readme

List

"List" is a simple double linked list class. This module is easy to use, light, small and has no dependencies, except assert-testing module for testing (not needed for usage).

The module is written in TypeScript and compiled into commonJS.

This is not any high-tech code. It is not dependent on 98761195187413.4 modules and does not offer unseen JavaScript magic. Download this, save an hour of your time and use it to create something awesome and efficient. We #keepItSimple.

Download

You can download the module on GitHub/simple-double-linked-list or using npm/simple-double-linked-list service.

npm install simple-double-linked-list --save

Double linked list - What is that? (skip if you know)

Linked list is a way to store unknown or large quantity of content, just like an array.

List has entirely different structure, then array though. Array is just a chunk of memory with initial point (position [0]). If you want for example 10th element, you know exactly, when to find it (array[10]). But, it is very inefficient when you want to insert or erase elements anywhere except the end. You must move the entire array by one position, which results in linear asymptotic complexity (inefficient). This is where double linked list excels.

Double linked list can insert or delete at any position with constant asymptotic complexity (very efficient). The problem is, that lists elements cannot be accessed randomly. The list must iterate all the elements to find or reach specific node, which results in inefficient linear asymptotic complexity. The is the lists weakness.

Summary: List is very efficient at inserting and deleting elements at any position, but the elements cannot be accessed randomly, like with an array. You would have to iterate thought the nodes and search (don't worry, the List class has search method implemented).

Usage

Import and create new List

You can import the module using import keyword or require function. In TypeScript, the List class is a generic class ("<>" thingies).

import { List } from "simple-double-linked-list";

//Instantiate new and empty List
var list = new List();

//For TypeScript programmers: List is a generic class, so declaration in TypeScript would look like:
let list = new List<string>(); //<string> or whatever data type you want to store and work with
var L = require("simple-double-linked-list")

//Instantiate new and empty List
var list = new L.List();

List iterator

The list may seem assembled very strangely for some programmers unfamiliar with a linked list. Browsing nodes and values can be confusing. That is why List come with class ListIterator, which handles browsing elements very easily.

By calling simple methods, link .Next() or .Previous(), you can explore the List without any knowledge about List structure whatsoever.

Iterator examples:


//Instantiate new and empty List
var list = new List();

//Add some random values
list.AddFront(1);
list.AddFront(5);
list.AddFront(6851);
list.AddFront(0);
list.AddFront(666);

//Get iterator, pointing on the first element
var iterator = list.Begin(); // == 1

//---1---5---6851---0---666---
//---^------------------------

//Move the iterator to the next position
iterator.Next(); // == 5

//---1---5---6851---0---666---
//-------^--------------------

//Move the iterator to the end
iterator.ToLast(); // == 666

//---1---5---6851---0---666---
//----------------------^^^---

//Extract the iterators value (current 666)
var evilNumber = iterator.Value(); // == 666

//Check if the iterator is at the end -> The iterator is at the end when values are no longer valid or defined (example below)
iterator.IsAtEnd(); // false

//Move the iterator to the next position
iterator.Next(); // The 666 number was the last one, so the iterator is now at the end (points to null)

//---1---5---6851---0---666---
//--------out of range--------

//Check if iterator is at the end
iterator.IsAtEnd(); // true

//We know, that iterator was at the end, so this will throw an error
var someNumber = iterator.Value();

Loop all List elements using the iterator:


//Instantiate new and empty List
var list = new List();

//Add 0-99 numbers
for (var i = 0; i < 100; i++)
	list.AddFront(i);

//Write 0-99 numbers into the console
for (var item = list.Begin(); !item.IsAtEnd(); item.Next())
	console.log(item.Value());

All iterator methods:


iterator.Next(); //Moves to the next node
iterator.Previous(); //Moves to the previous node
iterator.ToFirst(); //Moves to the first node
iterator.ToLast(); //Moves to the last node
iterator.Value(); //Returns current value
iterator.Size(); //Returns number of nodes in the iterator
iterator.IsAtEnd(); //Returns boolean - True if the iterator is at the end (points to null) -> calling .Value() would result in an error

List

Class List is constructed to work closely with its iterator. If you want to insert new values, delete old values or just update current values, you will have to use an iterator to indicate a position.

Working with the List is easy. Here are all implemented methods:


//Instantiate new and empty List
var list = new List();

list.AddFront("textFront"); //Adds a value in the front

list.AddBack("textBack"); //Adds a value in the back

list.Find("text"); //Finds a node with value "text" and returns ListIterator pointing to the found node
//If a node was not found, the method returns "null"

list.InsertAfter("textToInsert", iterator); //Inserts new value "textToInsert" after value on by the iterator

list.InsertBefore("textToInsert", iterator); //Inserts new value with "textToInsert" before a value on by the iterator

list.Remove(iterator); //Removes a value pointed on by the iterator
//Possible usage may look like this:
list.Remove(list.Find("valueToDelete"));

list.Update(iterator, "newValue"); //Changes value selected by the iterator to "newValue"

list.Empty(); //Returns True if the list is empty (== no values inserted)

list.Clear(); //Removes all values in the list

list.Size(); //Returns number of values in the list

list.Begin(); //Returns an iterator pointing to the beginning of the list (the first value)

list.End(); //Returns an iterator pointing to the end of the list (the last value)

list.Print(); //Prints lists content into the console

More examples

There is a testing file included in this module ("simple-double-linked-list/tests/list_tests.ts" for TypeScript or "simple-double-linked-list/dist/tests/list_tests.js" for JavaScript). The test is "not small", so you may find more examples of the the List class there.

Sorry for my English, I hope it's readable.