class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 94.5pt;">? 数据结构—数组和链表
?
?????一、数组是连续线性的结构,所储存的数据长度是不可更改的,不能对其进行插入,删除,修改的操作。
???? 身份证号的存储是数组,由于长度不够,从15位扩展到了18位。
???????????????
?
????????? 定义数组的四种方式:
????????????????? 1:数组类型[] 数组名= new 数组类型[长度];
????????????????? 2:数组类型[] 数组名={值…};
????????????????? 3:数组类型[] 数组名=new 数组类型[]{值…};
????????????????? 4:数组类型[] 数组名;
?????????????????????? 数组名= new 数组类型[长度];
?
???? 二、链表的存储是离散的,它的长度在建成之后可以改变,并且可以对其进行删改的操作。
???? 链表是由节点组成的,节点包括数据域和引用域,数据域中存储数据,引用域内存储下一节点的地址,由引用使节点联系起来,实际存储的位置可以是分散的。
?
//定义一个节点类
public class Node<E> {
 // 定义一个数据域
 public E data;
 // 定义一个引用域
 public Node next;
 public Node(E data) {
  this.data = data;
 }
 public Node getnext() {
  return next;
 }
 public void setnext(Node next) {
  this.next = next;
 }
??
???? 三、相较于数组,链表更多应用在灵活性的数据上,例如Q、电话号的存储
???????? 相较于链表,数组最大的优点是可以直接根据下标找到数据,查询更方便,而链表必须从头节点开 始一次查找。
?
???? 四、数组队列
???? 因为数组的长度一旦确定就不能改变,所以当我们要改变长度时,必须开辟一个新的存储空间,重新定义数组的长度,将原数组内容进行复制,并加入新的内容,这就形成了数组队列。
public class Array {
   private Object[] a=new Object[0]; 
   int size=0;
 
   //添加数组
   public void add(Object obj){
       size++;
       //创建一个长度+1的数组
     Object [] a1=new Object[size];
    if(size==0){
     
     a1[0]=obj;
    //原数组指向新的数组 
     a=a1;
    }
     //把原数组的内容复制给新数组
     for(int i=0;i<size-1;i++){
      a1[i]=a[i];
      
     }
     //把obj给新数组的最后一个位置
         a1[size-1]=obj;
     //原数组指向新的数组
         a=a1;
        }
   
   //删除数组
   public void remove(int index){
    if(index>=0&&index<size){
     size--;
     //创建一个长度-1的数组
     Object a2[]=new Object[size];
     a[index-1]=0;
     for(int i=0;i<index-1;i++){
      //把要删除的位置前面的数组赋值到新的数组里
      a2[i]=a[i];
     }
     for(int i=index;i<size;i++){
      //把要删除的位置后面的数组赋值到新的数组里
      a2[i]=a[i];
     }
     //将原来的数组指向新的数组
          a=a2;
     
    }
    
   }
   
   //得到数组元素的个数
    public int getsize(){
     return size;
    }
   //获取数组内容
    public Object gets(int i){
     if(i>=0&&i<getsize()){
      Object  obj=a[i];
      return obj;
      
     }
         return null;
    }
   
}
?
????? 五、链表的队列
????? 引用将节点建立联系,并可以进行节点的添加、删除、插入(待完成)等操作。
//定义一个链表类
public class LinkedNode<E> {
 private Node root;// 头节点
 private Node tail;// 尾节点
 private int size = 0;// 记录节点总数的计数器
 
 private int index;
    private E data;
 static Node node;
 Node node1;
 private static LinkedNode link;
 
 
 // 添加节点的方法
 public void add(Node node) {
  // System.out.println("调用了add方法");
//  Node node1 = new Node(data);
  // 判断头节点为null
  if (root == null) {
   root = node;// 将新节点给头节点
   tail = node;// 将新节点给尾节点
   System.out.println("第一个节点" + node);
  }
  // 将新节点添加到尾节点的后面
  else {
   tail.setnext(node);// 将新节点设置为尾节点的下一节点
   tail = node; // 将新添加的节点作为尾节点
   System.out.println("新加节点" + node);
  }
  size++;
 }
  //移除指定索引位置的数据
 
 public Node remove(int index) {
  // 循环的节点
  Node node = root;
  // 移除的节点
  Node removeNode;
  if (index == 0) {
   root = node.getnext();
   removeNode = node;
  } else {
   for (int i = 0; i < index - 1; i++) {
    node = node.getnext();
   }
   // 判断移除的节点是否是最后一个
   if (index == size - 1) {
    removeNode = node.getnext();
    node.setnext(null);
   } else {
    // 将node的下一个节点赋给要移除的节点
    removeNode = node.getnext();
    Node nextNode = removeNode.getnext();
    node.setnext(nextNode);
   }
  }
  size--;
  // 返回要删除节点的数据域对象
  return removeNode;
 }
 
 // 获取指定索引位置节点的参数
 public Node get(int index) {
  if (index < 0 || index >= size){
   return null;
   }
  Node node = root;
  // 循环获取到指定位置的诗句
  for (int i = 0; i < index; i++) {
   node = node.getnext();
  }
  return node;
 }
 
    
 // 返回链表中节点总数
 public int size() {
  return size;
 }
}
??
?
?