1、线性结构与非线性结构
线性结构:作为最常见的数据结构、特点是元素之间存在一对一的关系、常见的有 数组、队列、链表和栈
非线性结构包括:二位数组、多维数组、广义表、树结构、图结构
2、队列(数组实现)
/**
* @CLASSNAME ArrayQueueDemo
* @Description TODO
* @Author VV
* @Date 2022/5/11 22:16
* @Version 1.0.0
**/
class ArrayQueue{
private int rear;
private int front;
private int[] arr;
private int maxSize;
public ArrayQueue(int maxSize) {
this.rear = -1;
this.front = -1;
this.arr = new int[maxSize];
this.maxSize = maxSize;
}
// 判断队列是否满了
public boolean isFull(){
return rear == maxSize - 1;
}
// 判断队列是否为空
public boolean isEmpty(){
return rear == front;
}
// 添加数据
public void addQueue(int num){
if(isFull()){
System.out.println("队列满、不能加入");
return;
}
rear++;
arr[rear] = num;
}
// 获取数据
public int getQueue(){
// 判断队列是否为空
if(isEmpty()){
throw new RuntimeException("当前数据为空");
}
int value = arr[front];
front = (front + 1) % maxSize;
return value;
}
// 当前队列有效个数
public int size(){
return (rear + maxSize - front) % maxSize;
}
// 显示所有元素
public void showQueue(){
if(isEmpty()){
System.out.println("队列为空");
return;
}
for (int i = front; i < front + size(); i++) {
System.out.println(arr[i%maxSize]);
}
}
}
3、单链表
/**
* @CLASSNAME ArrayQueueDemo
* @Description TODO
* @Author VV
* @Date 2022/5/12 22:16
* @Version 1.0.0
**/
class SingleLinkedList{
// 初始化一个头节点
private Node head = new Node("",0);
// 向链表添加节点
public void addNode(Node node){
Node temp = head;
while (true){
if(temp.next == null){
break;
}
temp = temp.next;
}
temp.next = node;
}
// 更新节点
public void updateNode(Node node){
if(head.next == null){
System.out.println("当前节点为空");
return;
}
Node temp = head.next;
boolean flag = false;
while (true){
if(temp.next == null){
break;
}
if(temp.no == node.no){
flag = true;
break;
}
temp = temp.next;
}
if(flag){
temp.name = node.name;
}else {
System.out.println("没有找到编号为 %d 的节点\n" + node.no);
}
}
// 删除节点
public void deleteNode(Node node){
if(head.next == null){
System.out.println("当前链表为空");
return;
}
boolean flag = false;
Node temp = head.next;
while (true){
if(temp.next == null){
break;
}
if(temp.next.no == node.no){
flag = true;
break;
}
temp = temp.next;
}
if(flag){
temp.next = temp.next.next;
}else {
System.out.println("未找到要删除的节点");
}
}
// 显示链表
public void listNode(){
if(head.next == null){
System.out.println("当前链表为空");
return;
}
Node temp = head.next;
while (true){
if(temp == null){
break;
}
System.out.println("当前节点值 %d \n" + temp.no);
temp = temp.next;
}
}
}
class Node{
public int no;
public String name;
// 指向下一个节点
public Node next;
public Node(String name,int no){
this.name = name;
this.no = no;
}
@Override
public String toString() {
return "Node{" +
"no=" + no +
", name='" + name + '\'' +
'}';
}
}
3.1单链表的反转
// 单链表反转
public void reverseList(Node node){
// 如果当前链表为空、或者只有一个节点、无需反转、直接返回
if(head.next == null || head.next.next == null){
return;
}
// 定义一个辅助的指针
Node cur = head.next;
Node next = null;
Node reverseHead = new Node("", 0);
// 遍历原来的链表、每遍历一个节点、并放在reverseHead最前端
while (cur != null){
next = cur.next;
cur.next = reverseHead.next;
cur = next;
}
head.next = reverseHead.next;
}