链表存储结构
链表存储结构
CAMELLIA!!! note 目录
链表存储结构
一、链表的分类
- 单向链表(Singly Linked List):
- 每个节点包含一个数据域和一个指向下一个节点的指针。
- 只可以从头节点遍历到尾节点,不能反向遍历。
- 双向链表(Doubly Linked List):
- 每个节点包含一个数据域、一个指向下一个节点的指针和一个指向前一个节点的指针。
- 可以在链表中双向遍历,即可以从头节点遍历到尾节点,也可以从尾节点遍历到头节点。
- 循环链表(Circular Linked List):
- 单向循环链表(Singly Circular Linked List):
- 类似于单向链表,但尾节点指向头节点,形成一个环。
- 可以从任意节点开始遍历,并回到起点。
- 双向循环链表(Doubly Circular Linked List):
- 类似于双向链表,但尾节点指向头节点,形成一个环。
- 同样可以从任意节点开始遍历,并回到起点。
- 单向循环链表(Singly Circular Linked List):
二、链表的存储结构
2.1 单向链表
1 | +-------------------+ |
val
是存储在节点中的整数值。next
是一个指针,指向链表中的下一个节点。如果这是链表的最后一个节点,则next
指向NULL
。
1 | head -> [1 | next] -> [2 | next] -> [3 | next] -> [4 | next] -> null |
head
是链表的起始节点。- 每个节点的格式是
[val | next]
,其中val
是节点存储的数据,next
是指向下一个节点的指针。 - 节点1存储值1,节点2存储值2,以此类推。
- 最后一个节点的
next
指向null
,表示链表的结束。
2.2 双向链表
1 | +-------------------+ |
val
存储节点的数据。prev
是一个指针,指向链表中的前一个节点。如果这是链表的第一个节点,则prev
指向NULL
。next
是一个指针,指向链表中的下一个节点。如果这是链表的最后一个节点,则next
指向NULL
。
1 | head <-> [1 | prev] <-> [2 | prev] <-> [3 | prev] <-> [4 | prev] <-> null |
head
是链表的起始节点。- 每个方括号
[val | prev | next]
表示一个双向链表的节点: - 最后一个节点(节点4)的
next
指针指向null
,表示链表的结束。 - 每个箭头
<->
表示双向的链接,使得可以从一个节点到达前一个节点和后一个节点。
2.3单向循环链表
1 | +-------------------+ |
1 | head -> [1 | next] -> [2 | next] -> [3 | next] -> [4 | next] -> head |
head
是链表的起始节点。- 每个方括号
[val | next]
代表一个节点,其中val
是节点存储的值,next
是指向下一个节点的指针。 - 链表的最后一个节点的
next
指针指向head
,形成一个循环。 - 这种结构允许链表在不需要特定终点的情况下循环遍历。
2.4 双向循环链表
1 | +-------------------+ |
1 | head <-> [1 | prev: 4, next: 2] <-> [2 | prev: 1, next: 3] <-> [3 | prev: 2, next: 4] <-> [4 | prev: 3, next: 1] <-> head |
head
是链表的起始节点。- 每个方括号
[val | prev, next]
代表一个节点,其中val
是节点的值,prev
是指向前一个节点的指针,next
是指向下一个节点的指针。 - 链表的最后一个节点(节点4)的
next
指针指向head
,形成一个循环。 - 这种结构允许在链表的两端进行遍历,同时形成一个循环链表,可以在循环中反复遍历所有节点。