• [TS] Implement a singly linked list in TypeScript


    In a singly linked list each node in the list stores the contents of the node and a reference (or pointer in some languages) to the next node in the list. It is one of the simplest way to store a collection of items.

    In this lesson we cover how to create a linked list data structure and how to use its strengths to implement an O(1) FIFO queue.

    /**
     * Linked list node
     */
    export interface LinkedListNode<T> {
      value: T
      next?: LinkedListNode<T>
    }
    
    /**
     * Linked list for items of type T
     */
    export class LinkedList<T> {
      public head?: LinkedListNode<T> = undefined;
      public tail?: LinkedListNode<T> = undefined;
    
      /**
       * Adds an item in O(1)
       **/
      add(value: T) {
        const node = {
          value,
          next: undefined
        }
        if (!this.head) {
          this.head = node;
        }
        if (this.tail) {
          this.tail.next = node;
        }
        this.tail = node;
      }
    
      /**
       * FIFO removal in O(1)
       */
      dequeue(): T | undefined {
        if (this.head) {
          const value = this.head.value;
          this.head = this.head.next;
          if (!this.head) {
            this.tail = undefined;
          }
          return value;
        }
      }
    
      /**
       * Returns an iterator over the values
       */
      *values() {
        let current = this.head;
        while (current) {
          yield current.value;
          current = current.next;
        }
      }
    }
    import { LinkedList } from './linkedList';
    
    test('basic', () => {
      const list = new LinkedList<number>();
      list.add(1);
      list.add(10);
      list.add(5);
      expect(Array.from(list.values())).toMatchObject([1, 10, 5]);
      expect(list.dequeue()).toBe(1);
      expect(Array.from(list.values())).toMatchObject([10, 5]);
      expect(list.dequeue()).toBe(10);
      expect(list.dequeue()).toBe(5);
      expect(list.dequeue()).toBe(undefined);
      expect(Array.from(list.values())).toMatchObject([]);
      list.add(5);
      expect(Array.from(list.values())).toMatchObject([5]);
    });

    We can also see the beautiy of Generator with Array.from partten.

    Array.from(list.values())

    It saves lots of code to keep maintaing the indexing of the array.

    More

  • 相关阅读:
    解题报告:hdu1008 Elvator
    解题报告:hdu1003 Max Sum
    解题报告:hdu 1005 number subsequent
    矩阵快速幂
    初步
    学习笔记:矩阵的基本运算的实现
    解题报告:hdu1284 钱币兑换问题
    解题报告:hdu2191汶川地震
    解题报告:hdu1248寒冰王座
    解题报告:hdu2602 Bone collector 01背包模板
  • 原文地址:https://www.cnblogs.com/Answer1215/p/7621051.html
Copyright © 2020-2023  润新知