链表到底有什么用?

133 阅读2分钟

这是我参与8月更文挑战的第13天,活动详情查看:8月更文挑战

算法对很多人来说的意义就是刷题,奈何现在找工作都要写算法,但平时工作又用不到,只好硬着头片去学习了。其实如果借此进入了大厂,依然可以不怎么用所谓的算法混上个2-3年不成问题。所以算法的意义是什么?今天先不讨论原子弹还是拧螺丝的问题,今天就讨论一下算法到底有没有用。

leetcode关于链表的算法第一题好像是链表的反转,刷到链表时可能很多人的第一反应是先学习一下链表的结构,然后多做题加深印象,慢慢就熟悉了,但在工作中还是几乎用不上。可能多少都会有类似的疑问,为什么工作的代码里几乎用不上呢?其实不然。我们先实现一个简单的单链表:

class Node<T> {
    private T data;
    private Node next;
    
    public Node(T data){
        this.data = data;
    }

}

class LinkedList {
    private Node head;
    
    public LinkedList(Node head) {
        this.head = head;
    }
}

下面看一个简单的问题。

写一个方法,检查一个从外部系统给过来的用户列表,删除无效的用户。

这个实现起来真的很简单,我也见过无数个用ArrayList来实现的版本了。只不过ArrayList的remove不能和遍历同事进行,index会乱,这里有个小坑,但不是今天的重点。今天是要来分析,为什么用链表实现速度会更快。

首先进行一下复杂度分析:

  1. 遍历所有数据,这是数组和链表都跑不掉的,都是O(N)
  2. 用数组的话,每次删除我们就要另外再花O(N)步去左移后面的数据,以填补删除所产生的空隙
  3. 使用链表删除只需要一步O(1),毋需移动数据

这样都不用再做过多的解释,结果就显而易见了。实现起来也不复杂。


LinkedList<User> users = getUserList();

Iterator<User> it = list.iterator();
while (it.hasNext()) {
    it.next();
    if(cond) {
        it.remove();
    }
}

当数量到达一定量级时,使用数组和链表的差距会成倍增加。所以,链表有什么用呢?