[路飞]_链表(List)及经典问题(未完待续)

173 阅读1分钟

什么是链表?

抽象概念:链表代表了一种唯一指向思想 链表适合用于存储一些经常增加、删除的数据

  1. 链表中的每个节点至少包含两个部分:数据域与指针域
  2. 链表中的每个节点,通过指针域的值,形成一个线性结构
  3. 查找节点O(n),插入节点O(1),删除节点O(1)
  4. 不适合快速定位数据,适合动态的插入和删除数据的应用场景

几种经典的链表简单实现方法

传统实现方法

    class Node{
        constructor(data){
            this.data = data;
            this.prev = null;
            this.next = null;
        }
    }
    
    class SingleList{
        constructor(){
            this.size = 0;
            this.head = new Node('head');
            this.lastNode = this.head;
        }
        append(ele){
            let currNode = this.lastNode;
            let newNode = new Node(ele);
            currNode.next = newNode;
            this.size++;
            this.lastNode = newNode;
        }
    }
    
    let list  = new SingleList;
    list.append(6)
    list.append(8)
    list.append(2)
    list.append(3)
    list.append(1)
    
    let p = list.head
    while(p){
        console.log(p.data)
        p = p.next
    }
    //head -> 6 -> 8 -> 2 -> 3 -> 1

双数组方法

    class SingleList{
        constructor(){
            this.next = [0]
            this.data = ['head']
        }
        add(index,next,val){
           this.next[index] = next;
           this.data[next] = val
        }
    }

    let list = new SingleList;
    list.add(0,3,'地址3的字符串表达')
    list.add(3,5,'地址5的字符串表达')
    list.add(5,8,'地址8的字符串表达')
    list.add(8,2,'地址2的字符串表达')
    let p = 0;
    while(list.data[p]){
        console.log(list.data[p])
        p = list.next[p]
    }
    //head
    //地址3的字符串表达
    //地址5的字符串表达
    //地址8的字符串表达
    //地址2的字符串表达

链表的典型应用场景

场景一 :操作系统内的动态内存分配

将内存中的内存碎片通过链表的方式串起来

场景二: LRU缓存淘汰算法