队列
队列是一个有序列表,可以用数组或是链表来实现。
遵循先入先出的原则
数组模拟队列思路:
有maxSize作为最大容量,因为队列的输出和输入分别从前后端处理,所以需要两个变量front和rear分别记录队列前后端的下标,front随着队列的输出改变,rear随着输入改变:
将数据存入数组时:
尾指针往后移:rear+1,当front==rear时,为空
若尾指针 rear 小于队列的最大下标 maxSize-1 ,则将数组存入rear所指的数组元素中,rear==maxSize-1
队列满。
数组模拟环形队列:
对前面的数组模拟队列的优化,充分利用数组,因此将数组看成是环形的。
尾索引的下一个为头索引是表示队列满,即将队列容量空出一个作为约定,
这个在做判断队列满的时候要注意(rear+1)%maxSize == front 时满
rear == front 空
front指向队列的第一个元素,rear指向最后一个元素的后一个位置,得到环形队列
链表
- 链表是以节点的方式储存的,是链式储存。
- 每个节点包含data域,next域:指向下一个节点。
- 链表的各个节点不一定是连续储存
- 链表分带头节点的链表和没有头节点的链表
求单链表中有效节点的个数
//部分代码截取
class HeroNode{
public HeroNode next;//指向下一个节点
}
public static int getLength(HeroNode head){
if(head.next == null){//空链表
return 0;
}
int length = 0;
//定义一个辅助变量,这里没有统计头结点
HeroNode cur = head.next;
while(cur != null){
length++;
cur = cur.next;//遍历
}
return length;
}
查找单链表的倒数第k个节点
//1.编写一个方法,接受head节点,同时接受一个index
//2.index表示是倒数第index节点
//3.先把链表从头到尾遍历,得到链表的总长度getLength
//4.得到size后,我们从链表的第一个开始遍历(size-index)个,就可以得到
//部分代码截取
public static HeroNode findLastIndexNode(HeroNode head, int index){
//判断如果链表为空,返回null
if(head.next == null){
return null;//没有找到
}
//第一个遍历得到链表的长度(节点个数)
int size = getLength(head);
//第二次遍历 size-index位置,就是我们倒数的第K个节点
//先做一个index校验
if(index <= 0 || index > size){
return null;
}
//定义给辅助变量,for循环定位倒数的index
HeroNode cur = head.next;
for(int i = 0; i < size - index; i++){
cur = cur.next;
}
return cur;
}
单链表的反转
public static void reversetList(HeroNode head){
//如果链表为空,或者只有一个节点,无需反转,直接返回
if(head.next == null || head.next.next == null){
return;
}
//定义一个辅助的指针(变量),帮助我们遍历原来的链表
HeroNode cur = head.next;
HeroNode next = null; //指向当前节点[cur]的下一节点
HeroNode reverseHead = new HeroNode(0, ",");
//遍历原来的链表,每遍历一个节点,就将其取出,并放在新的链表reverseHead的最前端
while(cur != null){
next = cur.next; //先暂时保存当前节点的下一节点
cur.next = reverseHead.next;//将cur的下一节点指向新的链表的最前端
reverseHead.next = cur; //将cur连接到新的链表上
cur = next; //让cur后移
}
//将head.next指向reverseHead.next,实现单链表的反转
head.next = reverseHead.next;
}
双向链表
- 单向链表查找的方向只能是一个方向,而双向链表可以向前或者向后查询。
- 单向链表不能自我删除,需要靠辅助节点,而双向链表可以自我删除。(我们删除单链表节点时,总是找到待删除节点的前一个节点)
遍历: 和单链表一样,只是可以向前也可以向后。
添加: 默认添加到链表的最后。先找到最后的节点,temp.next = newNode, newNode.pre = temp
删除: 直接找到要删除的节点temp,令temp.pre.next = temp.next, temp.next.pre = temp.pre
栈
栈是一个先入后出的有序列表
栈是限制线性表中元素的插入和删除只能在线性表同一端进行的特殊线性表。允许插入和删除的一段,为变化的一端,称为栈顶。另一端为栈底。
树
二叉树
最多只能有两个子节点
如果二叉树的所有叶子结点都在最后一层,并且节点总数为: 2^n-1 ,n为层数,则称为满二叉树
如果二叉树所有的叶子结点都在最后一层或是倒数第二层,而且在最后一层的叶子节点在左边连续,倒数第二层的叶子结点在右边连续,称完全二叉树。
二叉树遍历:
前序遍历:先输出父节点,在遍历左子树和右子树
中序遍历:先遍历左子树,在输出父节点,再遍历右子树
后序遍历:先遍历左子树,再右子树,最后输出父节点。