链表

128 阅读2分钟

什么是链表

链表(Linked List)是线性表,用于存储一组数据,不必为其开辟连续的内存空间,元素之间通过指针(引用)连接。

链表的分类

  • 单向链表(Singly Linked List)
  • 双向链表(Doubly Linked List)
  • 单向循环链表(Circular Linked List)
  • 双向循环链表(Doubly Circular Linked List)

链表较于数组的优缺点

这里和数组做对比

优点:

  • 链表不需要系统分配连续的内存空间。
  • 插入&删除节点不需要做大量数据的移动,时间复杂度O(1)。

缺点

  • 相较于数组,链表多了字段存储指针,比数组更消耗内存。追求极致低的内存消耗的话,优先考虑数组。
  • 由于不是连续的内存空间,所以不能利用到CPU的缓存机制。
  • 对链表频繁的插入和删除,容易产生内存碎片。
  • 不支持随机访问,要访问第i个元素的时间复杂端是O(n)。

处理链表的技巧

  1. 处理好指针(引用),预防指针丢失

  2. 巧用哨兵节点简化代码实现

  3. 注意边界情况

比如链表为空,只有一个节点,只有两个节点的场景

  1. 举例画图

既形象,又能释放不多的大脑运行时内存。

  1. 多练

无他,唯熟尔,练习题:

两数相加

链表反转

思考题

如何判断链表实现的字符串是否是回文?

如果字符串是通过单链表来存储的,那该如何来判断是一个回文串呢?你有什么好的解决思路呢?相应的时间空间复杂度又是多少呢?

什么是回文字符串? 一个长度为n的字符串,当其满足任意第i(0≤i<n)个元素等于第(n-1-i)个元素时,此时称该字符串为回文字符串。比如:adcba

方案1 思路:将原链表A复制出来反转生成链表B ,然后分别从A和B的表头开始逐次对比它俩的每一个元素,如果在任意第i步中发现它两的元素不相等,则原字符串不是回文字符串。如果遍历结束未发现不相等,则是回文字符串。 时间复杂度: O(n) 空间复杂度: O(n)

方案2 你在期待啥,等着更机智的你来写