Java数据结构与算法基础(一)概述与线性结构

Java数据结构与算法基础(二)递归算法
Java数据结构与算法基础(一)概述与线性结构

学习目的:为了能更顺畅的读很多底层API代码和拓宽解决问题的思路

一、数据结构概述
  1.数据结构是什么?数据与数据之间的关系
  2.数据结构的分类:
    存储结构分类:顺序结构和链式结构
    逻辑结构分类:线性结构(除了首位元素,其他元素都存在前一元素和后一元素)、集合结构(集合)、树形结构(树结构、文件夹、文件结构)、图形结构(多对多结构)
二、算法概述
  1.算法特性:输入(0或多个输入)、输出(一个输出)、有穷性(能出结果)、确定性(一一对应)、可行性(能解决问题)
  2.算法的基本要求:正确性、可读性、健壮性、时间复杂度、空间复杂度
  3.没有最好的算法,只有最适合的算法
三、线性结构
  1.数组的基本概念与操作
    ① 存储结构:顺序方式存储
    ② 访问方式:数组名[下标],最大下标 = arr.length-1;
    ③ 元素默认值 = 0,赋值:数组名[下标] = value;
  2.数组创建的时候就要指定长度(即数组长度不可变)
    问题:如何解决数组长度不可变?如在数组末尾添加元素
    解决:① 建一个新数组,长度 = oldArr.length+1;
        ② 复制旧数组元素到新数组,新数组的末尾元素 = 新元素;
        ③ oldArr = newArr
  3.数组元素的删除(先告诉我删哪个元素)
    ① 建一个新数组,长度 = oldArr.length-1;
    ② 复制旧数组元素
      newArr[i] = oldArr[i]; // i       newArr[i] = oldArr[i+1]; // i>n
    ③ oldArr = newArr;
  4.面向对象的数组
    属性(一个私有的数组)+方法(操作私有属性数组的方法)
    要点:① 长度变化就意味着要建新数组,替代旧数组
        ② 传入下标的方法,首先都应该判断数组越界的问题
  5.(数组)查找算法
    线性查找:依次对比元素,找到相同元素即break
    二分法查找:① 先排序,再查找

public static int binarySearch(int [] arr, int target){
if (arr == null) {
  return -1;
}
int begin = 0;
int end = arr.length-1;
int mid = ((end - begin) >>> 1) + begin;
while(begin <= end){
  if (arr[mid] == target) {
    return mid;
  }
  if(arr[mid] > target){
    end = mid-1;
  }else if(arr[mid] < target){
    begin = mid+1;
  }
  mid = ((end - begin) >>> 1) + begin;
}
return -1;
}

  6.栈:先进后出
    数组实现:入栈(建新数组,复制元素,新元素放到新数组最后,新数组替换对象旧数组属性)、出栈(建新数组,复制元素,取出最后一个元素,新数组替换对象中的旧数组属性,返回旧数组的最后一个元素)、查看栈元素(不涉及数组长度变化,所以直接返回旧数组的索引对应的值即可)
  7.队列:先进先出
    数组实现:入队、出队、队列是否为空(套路:建新数组主要涉及长度、复制元素、替换旧数组操作)
  8.单链表:
    存储形式:链式存储(存当前节点,同时存下个节点的位置[最后一个节点除外])
      Java中单链表的结构:
      Node:
        int data;
        Node next;
        public Node(int data){
          this.data = data;
        }

    涉及的操作:
      通过第一个节点进行追加操作:
        ① 获取当前节点:Node currentNode = this;
        ② while(true){
          获取下一个节点:Node next = currentNode.next;
          如果下个节点为null,即最后一个节点:break;
          否则:currentNode = next;
        }
        ③ 追加节点到末尾:currentNode.next = node;//入参的Node
        ④ 返回当前节点 return this;
      判断当前节点是否是最后一个节点:
        判断当前节点的下一个节点是否为空即可
      ☆ 删除单链表的节点:取不到上个节点信息(这是问题),所以只能删除下个节点信息
        ① 取到下下个节点
        ② 将下下个节点赋值给当前节点的下个节点
      显示所有节点信息:
        ① 打印当前节点信息
        ② currentNode = currentNode.next;
        如果currentNode == null; break;
        否则重复①~②
      插入新节点:
        ① tempNode = currentNode.next;//作为下下个节点
        ② currentNode.next = node; //node 为新节点
        ③ node.next = tempNode;
  9.循环链表:
    结构:单链表的尾节点的下个节点是头结点
      LoopNode{
        int data;
        LoopNode next = this;//默认自身是个循环链表,下个节点为其自身,插入节点操作和单链表相同
      }

  10.双向循环链表:
    结构:包含上个节点信息、下个节点信息、当前节点内容
      DoubleNode{
        DoubleNode pre = this;
        DoubleNode next = this;
        int data;
      }

    主要操作:新增节点

你可能感兴趣的:(Java数据结构与算法基础)