数据结构
什么是数据结构?什么又是算法?
数据结构就是用来装数据的容器,而算法是用最科学,最合理的方法来操作这个容器里边的数据。
线性数据结构
线性数据结构是一维数据结构
特点: 数据呈线状排列
数组
数组的特点
* 物理空间上是连续的。
* 优点:查找的时候效率更高
* 缺点:因为空间是连续的,所以当磁盘的空间碎片较多的时候,我们可能无法存入大数组,即使内存空间足够,也无法存储
数组的遍历求和
//建立数组
int[] arr = new int[]{0,1,2,3,4,5,6,7,8,9};
遍历
for (int i = 0 ; i < arr.length ; i++){
System.out.println(arr[i]);
}
求和
算法是十分严谨的,所以判断是不能少的,如果少了判断机器一样会判断为错误的程序
public static int sum(int[] arr){
//算法非常强调严谨,所以要先判断
if (arr == null) return 0;
int total = 0;
for (int i = 0 ; i < arr.length ; i++){
total += arr[i];
}
return total;
}
链表
链表的特点
* 空间可以不是连续的,需要在存放数据的同时,多创建一个空间,用来存放地址
* 优点:不受空间大小的影响,只要有空间,就能存储数据,不受空间连续的制约
* 缺点:查找效率没有数组高
* 需要多开辟一块空间用来存放地址
链表的遍历求和
//建立链表
Node node1 = new Node(1);
Node node2 = new Node(2);
Node node3 = new Node(3);
Node node4 = new Node(4);
Node node5 = new Node(5);
node1.next = node2;
node2.next = node3;
node3.next = node4;
node4.next = node5;
//链表的传递,传递的是链表的首节点
求和
public static int nodeSum(Node node){
int total = 0;
while (node != null){
total += node.val;
node = node.next;
}
return total;
}
遍历
public static void printNode(Node node){
while (node != null){
System.out.println(node.val);
node = node.next;
}
}
递归遍历
递归的思想穿插着整个数据结构,递归的思想需要很多时间,很多练习来理解
public static void printNodeDG(Node node){
if (node != null) System.out.println(node.val);
printNodeDG(node.next);
}
这只是有了一个递归的雏形,但是这个写法有问题
他会无穷无尽向下递归,最后返回出一个空指针异常 java.lang.NullPointerException
造成这样的原因是,递归在第五个节点后,第五个节点的地址已经指向了空但是递归仍在执行,所以递归需要出口
public static void printNodeDG(Node node){
//递归的三个要素
if (node == null ) return;//递归出口
System.out.println(node.val);//对每个节点的通用操作 1 2 3 4 5
printNodeDG(node.next);//向下递归点
//System.out.println(node.val);// 1 2 3 4 5 5 4 3 2 1
}
链表的逆置
在链表中每个节点都认为自己是根节点,如果从第一个节点传进去那么第二个节点指向第一个节点的地址但是链表却断了,第三个节点就无法找到了
但是如果从最后一个节点传进去,每个节点都认为自己是根节点,无法找到上一个节点,所以我们应该从倒数第二个节点传入
public static Node change(Node node){
if (node.next.next != null){
Node result = change(node.next);
node.next.next = node;
node.next = null;
return result;
}else {//当前的节点为倒数第二个,下一个节点为最后一个节点
Node result = node.next;
node.next.next = node;//让5指向自己
node.next = null ;//让自己指向空
return result;//返回最后一个节点,也就是新的根节点
}
}