二叉树
不论是深度优先还是广度优先,基本上是访问节点一次且仅一次
数据结构
链表
链表的这种特性,无法通过索引直接访问节点,但可以快速的删除和插入节点,因为 只需要修改 节点的引用
常见链表(4种):
注意:
如果添加或删除的是头部
节点,都需要重新
设置头部节点引用(一般都重新设为修改后的第一个节点)
用一个类来表示一个节点
value
表示节点的数据
next
表示对后继节点的引用
这里的next
也是一个node
对象,所以是一个递归的结构
然后设置头节点:
因为Node(上一张图中定义的class)是递归的结构,对于单链表只需要头部节点的引用就可以了
所有的节点查找插入和删除都需要通过头节点
来操作
查找节点的代码:
currentNode
和头部进行比对,不一样就生成为下一个节点,一样就退出while循环,一样的这个就是被找到的节点
如果最后currentNode
返回了null
,则表示访问到了尾部节点,但仍未找到对应的值
指定位置插入的方法:
两个参数
第一个:指定在哪个节点的后面(这里传的是节点的值,用于上图方法中遍历)
第二个:新节点的值
注意:这里 先创建 新节点的对象 newNode
,然后找到对应的节点currentNode
,然后把新节点的next
指向 这个节点的后继节点
再把这个节点的后继节点指向新节点,这样新节点就插入指定节点和指定节点的后继节点的中间了
在链表尾部追加节点
头部插入节点:
注意: 头部插入新节点后,一定要重新设置头部节点,把当前对头部节点的引用head
指向这个新创建的节点
删除
保存头部节点head
和后继节点previousNode
头的值和下一个不一样,就把头赋值给下一个,下一个再继续和下下个比对
删除头部节点
循环列表:
在linklist中添加一个tail属性,保存尾部节点,并让尾部节点指向head的节点
双向循环:
只要把head的pre指向tail即可
队列
注意:队列常见的应用场景是基于 事件的处理系统
比如 js的事件循环机制,订单处理系统,邮件处理系统等等,都是基于消息队列实现的
等等
https://blog.csdn.net/weixin_52622200/article/details/119765008