链表
- 链表是以节点的方式来存储
- 每个节点包含 data 域,next 域:指向下一个节点
- 链表的各个节点不一定是连续存储
- 链表分带头节点的链表 和没有头节点的链表,根据实际的需求来确定。
[实践:实现单向链表的增删改查]
添加(创建)链表思路
- 先创建应该 head 头节点,作用就是表示单链表的头
- 后面我们每添加一个节点,就直接加入到链表的最后
- 遍历:1.通过一个辅助变量,帮助遍历整个链表
第二种方式:需要按照编号的顺序添加:
- 首先找到新添加的节点的位置,是通过辅助变量(指针),通过遍历来搞定。
- 新的节点.next = temp.next
- 将 temp.next = 新的节点
从单链表中删除一个节点的思路
- 我们先找到 需要删除的这个节点的前一个节点 temp
- temp.next = temp.next.next
- 被删除的节点,将不会有其他引用指向,会被垃圾回收机制回收
双向链表
单向链表的缺点分析:
- 单向链表,查找的方向只能是一个方向,而双向链表可以向前或者向后查找。
- 单向链表不能自我删除,需要靠辅助节点,而双向链表可以自我删除,所以我们前面用单链表删除节点时,总是找到temp的下一个节点来删除的。
双向链表
分析双向链表的遍历、添加、修改、删除的操作思路 ==》 代码实现
- 遍历: 方法与单链表一样,只是可以向前,也可以向后查找
- 添加(默认添加到双向链表的最后)
(1) 先找到双向链表的最后这个节点
(2) temp.next = newHeroNode;
(3) newHeroNode.pre = temp; - 修改思路和原来的单向链表一样
- 删除
(1) 因为是双向链表,因此,我们可以实现自我删除某个节点
(2) 直接找到要删除的这个节点,比如temp
(3)temp.pre.next = temp.next;
(4) temp.next.pre = temp.pre;
单向环形链表应用场景(著名的约瑟夫问题)
构建一个单向的环形链表的思路:
- 先创建第一个节点,让 first 指向该节点,并形成环形
- 后面当我们每创建一个新的节点,就把该节点,加入到已有的环形链表中即可。
遍历环形链表:
- 先让一个辅助指针(变量)curBoy,指向first节点。
- 然后通过一个while循环遍历该环形链表即可 curBoy.next == first 结束。