![be339beb9982349ade2c39e3f07be8f1.png](https://i-blog.csdnimg.cn/blog_migrate/fdc70805fc8073037ef6d7c28b98113d.jpeg)
一、前言
链表是基本的数据结构之一,它与数组不同,数组在内存中存储,需要一块连续的内容空间来存储,对内存的要求比较高。例如我们需要 100MB 大小的数组,内存中就必须有一段连续的 100MB 的内存空间,否则就会出现 OOM。
而链表则不同,链表不需要一块连续的内存空间。它是通过“指针”,将一组零散的内存块串联起来。所以完全不用担心连续内存空间以及扩容等问题。
![5dd7f688514ce52756407a181c404bf4.png](https://i-blog.csdnimg.cn/blog_migrate/90a34372f1d3445af5f65902cc18591d.jpeg)
数据结构中的链表,一直是面试的常客,尤其是它引申出来的一些面试题,其实只要掌握了其中的技巧,很多同类型的链表题,思路都是相似的。
今天就来聊聊单链表的快慢指针思路,在有些算法书里,也把它称为双指针。很多和单链表相关的算法题,都可以通过快慢指针的方式解决。
在文章中,还会举几个快慢指针相关的算法题的例子,加深大家的理解。例如:求单链表倒数第 K 个节点、求单链表的中间节点、判断链表是否有环。
二、链表
2.1 什么是链表
链表是通过“指针”,将一组零散的内存块串起来,它不需要连续的内存空间,链表中的每个结点,都存储了下一个结点的内存地址的指针。
![b70938332e42ef889c1685c3686a24eb.png](https://i-blog.csdnimg.cn/blog_migrate/a3e8079310f5e44c73d79b49d91af6a7.jpeg)
所以链表在声明时,不需要和数组一样连续的内存空间,但是它需要额外的空间来存储与之关联的结点指针,通常就会认为,链表比数组会消耗更多的内存空间。
但是其实在我们正常的编码过程中,链表中存储的每个结点,其实是远大于指针存储