This commit is contained in:
krahets
2023-10-27 23:48:10 +08:00
parent a42c1d62b9
commit 368cbf4261
10 changed files with 195 additions and 212 deletions

View File

@@ -25,7 +25,7 @@ comments: true
!!! question "为什么数组要求相同类型的元素,而在链表中却没有强调同类型呢?"
链表由点组成,点之间通过引用(指针)连接,各个点可以存储不同类型的数据,例如 int、double、string、object 等。
链表由点组成,点之间通过引用(指针)连接,各个点可以存储不同类型的数据,例如 int、double、string、object 等。
相对地,数组元素则必须是相同类型的,这样才能通过计算偏移量来获取对应元素位置。例如,如果数组同时包含 int 和 long 两种类型,单个元素分别占用 4 bytes 和 8 bytes ,那么此时就不能用以下公式计算偏移量了,因为数组中包含了两种长度的元素。
@@ -35,19 +35,19 @@ comments: true
!!! question "删除节点后,是否需要把 `P.next` 设为 $\text{None}$ 呢?"
不修改 `P.next` 也可以。从该链表的角度看,从头点遍历到尾点已经遇不到 `P` 了。这意味着点 `P` 已经从链表中删除了,此时点 `P` 指向哪里都不会对这条链表产生影响了。
不修改 `P.next` 也可以。从该链表的角度看,从头点遍历到尾点已经遇不到 `P` 了。这意味着点 `P` 已经从链表中删除了,此时点 `P` 指向哪里都不会对这条链表产生影响了。
从垃圾回收的角度看,对于 Java、Python、Go 等拥有自动垃圾回收的语言来说,节点 `P` 是否被回收取决于是否有仍存在指向它的引用,而不是 `P.next` 的值。在 C 和 C++ 等语言中,我们需要手动释放节点内存。
!!! question "在链表中插入和删除操作的时间复杂度是 $O(1)$ 。但是增删之前都需要 $O(n)$ 查找元素,那为什么时间复杂度不是 $O(n)$ 呢?"
如果是先查找元素、再删除元素,确实是 $O(n)$ 。然而,链表的 $O(1)$ 增删的优势可以在其他应用上得到体现。例如,双向队列适合使用链表实现,我们维护一个指针变量始终指向头点、尾点,每次插入与删除操作都是 $O(1)$ 。
如果是先查找元素、再删除元素,确实是 $O(n)$ 。然而,链表的 $O(1)$ 增删的优势可以在其他应用上得到体现。例如,双向队列适合使用链表实现,我们维护一个指针变量始终指向头点、尾点,每次插入与删除操作都是 $O(1)$ 。
!!! question "图片“链表定义与存储方式”中,浅蓝色的存储点指针是占用一块内存地址吗?还是和点值各占一半呢?"
!!! question "图片“链表定义与存储方式”中,浅蓝色的存储点指针是占用一块内存地址吗?还是和点值各占一半呢?"
文中的示意图只是定性表示,定量表示需要根据具体情况进行分析。
- 不同类型的点值占用的空间是不同的,比如 int、long、double 和实例对象等。
- 不同类型的点值占用的空间是不同的,比如 int、long、double 和实例对象等。
- 指针变量占用的内存空间大小根据所使用的操作系统及编译环境而定,大多为 8 字节或 4 字节。
!!! question "在列表末尾添加元素是否时时刻刻都为 $O(1)$ "