JavaScript Data Structures: Singly Linked List: Get
Tags: beginners, tutorial, javascript, webdev
Published: 2019-11-27 11:24:53

---
title: "JavaScript Data Structures: Singly Linked List: Get"
description: "JavaScript Data Structures: Singly Linked List: Get"
published: true
tags: ["Beginners", "Tutorial", "JavaScript", "Webdev"]
series: JavaScript Data Structures
---

## Intro

[Last time](https://dev.to/miku86/javascript-data-structures-singly-linked-list-shift-4gl0), we learned how to shift / remove a node from the beginning of our Singly Linked List.

Today, we learn how to get any specific node by its index.

---

## Current Code

We start with the code [after we added `push()`](https://dev.to/miku86/javascript-data-structures-singly-linked-list-push-3el0), because we want to keep the code as simple as possible to understand. We need `push()` to add some nodes to the List.

```js
class Node {
  constructor(value) {
    this.value = value;
    this.next = null;
  }
}

class SinglyLinkedList {
  constructor() {
    this.length = 0;
    this.head = null;
    this.tail = null;
  }

  push(value) {
    const newNode = new Node(value);
    if (this.length > 0) {
      this.tail.next = newNode;
    } else {
      this.head = newNode;
    }
    this.tail = newNode;
    this.length += 1;
    return newNode;
  }
}
```

---

## Thoughts

First, we should think about the constraints and possibilities:

If the index is negative or equal to or greater than the length of the List:

- return null

Else:

- start at the beginning of the List
- go to the next node [index]-times
- return this node

Examples:

- index < 0: return null
- index = 0: return `head`
- index >= List.length: return null
- remaining cases: go to head, go index-times to the next node & return this node

Differences:

- return null if the List doesn't have the desired node or go index-times to the next node

## Implementation (Short version, DRY)

```js
class Node {
  constructor(value) {
    this.value = value;
    this.next = null;
  }
}

class SinglyLinkedList {
  constructor() {
    this.length = 0;
    this.head = null;
    this.tail = null;
  }

  push(value) {
    const newNode = new Node(value);
    if (this.length > 0) {
      this.tail.next = newNode;
    } else {
      this.head = newNode;
    }
    this.tail = newNode;
    this.length += 1;
    return newNode;
  }

  get(index) {
    // return null if index is negative or equal to or greater than the length of the List
    if (index < 0 || index >= this.length) {
      return null;
    } else {
      // start at the beginning of the List
      let currentNode = this.head;
      // keep track how many times we went to the next node
      let count = 0;

      // as long as the current count is smaller than the desired node's index
      while (count < index) {
        // set the next node as the currentNode
        currentNode = currentNode.next;
        // increase the count by 1
        count += 1;
      }

      // return this node
      return currentNode;
    }
  }
}
```

---

## Result

Let's have a look how to use the Singly Linked List's `get` method and its results.

```js
const newSLL = new SinglyLinkedList();

// show List, should be empty
console.log(newSLL);
// SinglyLinkedList { length: 0, head: null, tail: null }

// add three nodes
newSLL.push("0");
newSLL.push("1");
newSLL.push("2");

// there is no node with a negative index
console.log(newSLL.get(-1));
// null

// there is no node with that high of an index
console.log(newSLL.get(3));
// null

// show me the first node
console.log(newSLL.get(0));
// Node {
//   value: '0',
//   next: Node { value: '1', next: Node { value: '2', next: null } }
// }

// show me the second node
console.log(newSLL.get(1));
// Node { value: '1', next: Node { value: '2', next: null } }

// show me the third node
console.log(newSLL.get(2));
// Node { value: '2', next: null }
```

---

### Next Part

We will implement how to give a specific node a new value. If you want to be notified, [subscribe](https://miku86.com/) :)


---

### Questions:

- Any ideas how to improve the post or code?
- Any specific questions?