When to actually use linked lists
Tags: datastructures, javascript, algorithms, java
Published: 2019-10-24 19:24:31

&nbsp;&nbsp;We've all learned in school or in our bootcamps about different complex data structures. Linked lists, hash maps, binary trees and search trees, stacks, queues, monotonic queues, etc... We've all also learned about how to write each one, how to traverse nodes, add nodes, and delete nodes. _But_ what good is knowing all this stuff if we don't actually know when to _use_ these data structures..

###Linked Lists

&nbsp;&nbsp;As a brief recap, let's recall what linked lists are. Linked lists are a series of "nodes" containing a value as well as a pointer to the next node in the series. In a linked list you have access to the "head" of the list and all subsequent nodes are found by traversing through the list one by one. A doubly linked list has the same properties except a reference to the "tail" is kept as well and nodes also have a reference to the previous node, and the list can be traversed in reverse. Linked lists are usually compared to arrays as a similar data structure and although arrays are "primitive" data structures, they share similarities with linked lists. 

####Similarities
&nbsp;&nbsp;They both, for example, require traversal to access all elements in the structure and they both can be used to store linear data of similar types.

####Differences
&nbsp;&nbsp;To really notice the differences you need to be programming in an older, compiled language such as C++, Java, or C# where arrays are of fixed length. 
<li>This is because the memory for each array is allocated on compile, while linked lists get allocated on runtime. This is advantageous to link lists because they can be resized dynamically at runtime, while changing the size of an array involves creating a new array of longer length and using more memory, or you have to know the upper limit of the needed length beforehand, wasting memory space. This is less of an issue in JavaScript, Python, and Ruby where arrays can be dynamically resized using operations like .push() and .pop()</li>

<li>The memory allocation however is more efficient with arrays than link lists because the data at each index is stored directly in the allocation for each index, whereas link lists have to store a value, as well as a pointer to the next (or previous and next in a doubly linked list) node.</li>

<li>Arrays can also reference a particular element using an index, so to get the 5th element:  

```java
    String[] array = new String[10]; //initializes new array of strings with length 10
    String fifth = array[4]; //access the fifth element in the array (constant time) 
```
and so on, while linked lists require access to the head, and then a loop to traverse the elements: 

```java
LinkedList<String> linkList = new LinkedList<String>();
 //initializes a new linkList with type string. (no length specified)
 linkList.search(4);

//then inside the linkList class:
public <T> search(int input){ 
  head = current;
  int counter = 1;
  while(current.next != null){
    if(counter == input){
      return current.value
    }
    else{
      counter++;
      current = current.next;
    } 
```

Here we are looking for the 4th element of linkList, so we have to iterate through the first three values to get the fourth. Since space time complexity is worst case scenario, the lookup of a value in a linked list is _O(n)_ because it is dependent on the length of the linked list as well as the index you are searching for. An array lookup on the other hand is a constant time-complexity ( _O(1)_ ) because it is a direct lookup to the memory location of an element at a specific index. </li>

<li>Linked lists (especially doubly linked lists) have a better space time complexity for adding and removing nodes at ends because inserting (or removing) the target element consists of simply changing the pointer(s) of the surrounding elements. To insert in the middle the complexity is still linear ( _O(n)_ ) in a singly linked list because you must traverse to the index and update the pointer. The advantage here over an array comes from it's space complexity where you must traverse to an index, insert the value, and then find something to do with the remaining elements to re-position them. This is done a few different ways but requires more memory regardless. </li>

####Use Cases
&nbsp;&nbsp;So looking at the key differences between arrays and linked lists we can see the advantages and disadvantages of each and start to draw conclusions about when to use each. Linked lists utilize their key characteristic, to keep things quick and ordered, to really shine. Real-world applications most commonly include use in _other_ complex data structures. Hash tables, graphs, stacks, queues, and dequeues all utilize linked lists internally. 
<li>A linked list can be used as a stack by repeatedly adding and removing elements from the 'head' of the list.

```java
  // create stack linked list 
  StackUsingLinkedlist stack = new StackUsingLinkedlist(); 
  // insert Stack value at head of linked list
     stack.push(task1); 
     stack.push(task2); 
     stack.push(task3); 
     stack.push(task4);

  while(!stack.isEmpty()){
    //execute the task at the top of the stack (head of linked list)
    execute(stack.pop());
  }
```

<li>A doubly linked list can be used as a queue by adding to the 'head' of a linked list and removing from the 'tail'. 
<li>Linked lists can also be the buckets on hash tables to prevent intersection. (If something is already at that hash location, add it to the end of the list). <li>Other real world applications can include the back button on a browser, an undo button in photoshop, or the cycle of applications running on an operating system. 

###Conclusion
There is a time and a place to use linked lists and most commonly it's when you want quickly add and remove elements from a container. Usually this occurs in stacks and queues with lower space time complexity over arrays or when you want to keep ordered data with more flexibility than arrays.

Stay tuned next week for part 2 of practical applications: When to actually use stacks.











######References:
######https://www.geeksforgeeks.org/linked-list-vs-array/
######https://www.quora.com/In-which-languages-are-arrays-automatically-resizable-and-in-which-are-they-a-fixed-length