Linked list examples

These examples define nodes and a linked list, then demonstrate appending, insertion after a known node, removal, and traversal.

Python

class Node:
    def __init__(self, value):
        self.value = value
        self.next = None


class LinkedList:
    def __init__(self):
        self.head = None

    def append(self, value):
        new_node = Node(value)
        if self.head is None:
            self.head = new_node
            return

        current = self.head
        while current.next is not None:
            current = current.next
        current.next = new_node

    def insert_after(self, target, value):
        current = self.head
        while current is not None:
            if current.value == target:
                new_node = Node(value)
                new_node.next = current.next
                current.next = new_node
                return
            current = current.next
        raise ValueError(f"node {target} was not found")

    def remove(self, value):
        previous = None
        current = self.head
        while current is not None:
            if current.value == value:
                if previous is None:
                    self.head = current.next
                else:
                    previous.next = current.next
                return current.value
            previous = current
            current = current.next
        raise ValueError(f"node {value} was not found")

    def values(self):
        result = []
        current = self.head
        while current is not None:
            result.append(current.value)
            current = current.next
        return result


def print_label_value(label, value):
    print(f"\033[1;36m{label}:\033[0m {value}")


def state(linked_list):
    return " -> ".join(linked_list.values())


reports = LinkedList()
reports.append("GS-2042")
reports.append("GS-2043")
print_label_value("1. After append", state(reports))

reports.insert_after("GS-2042", "GS-2044")
print_label_value("2. After insertion", state(reports))

print_label_value("3. Remove node", reports.remove("GS-2043"))
print_label_value("4. Traverse", state(reports))

JavaScript

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

class LinkedList {
  constructor() {
    this.head = null;
  }

  append(value) {
    const newNode = new Node(value);
    if (this.head === null) {
      this.head = newNode;
      return;
    }

    let current = this.head;
    while (current.next !== null) {
      current = current.next;
    }
    current.next = newNode;
  }

  insertAfter(target, value) {
    let current = this.head;
    while (current !== null) {
      if (current.value === target) {
        const newNode = new Node(value);
        newNode.next = current.next;
        current.next = newNode;
        return;
      }
      current = current.next;
    }
    throw new Error(`node ${target} was not found`);
  }

  remove(value) {
    let previous = null;
    let current = this.head;
    while (current !== null) {
      if (current.value === value) {
        if (previous === null) {
          this.head = current.next;
        } else {
          previous.next = current.next;
        }
        return current.value;
      }
      previous = current;
      current = current.next;
    }
    throw new Error(`node ${value} was not found`);
  }

  values() {
    const result = [];
    let current = this.head;
    while (current !== null) {
      result.push(current.value);
      current = current.next;
    }
    return result;
  }
}

function printLabelValue(label, value) {
  console.log(`\x1b[1;36m${label}:\x1b[0m`, value);
}

function state(linkedList) {
  return linkedList.values().join(" -> ");
}

const reports = new LinkedList();
reports.append("GS-2042");
reports.append("GS-2043");
printLabelValue("1. After append", state(reports));

reports.insertAfter("GS-2042", "GS-2044");
printLabelValue("2. After insertion", state(reports));

printLabelValue("3. Remove node", reports.remove("GS-2043"));
printLabelValue("4. Traverse", state(reports));

Expected output

1. After append: GS-2042 -> GS-2043
2. After insertion: GS-2042 -> GS-2044 -> GS-2043
3. Remove node: GS-2043
4. Traverse: GS-2042 -> GS-2044