线性表之链式存储结构

来源:互联网 发布:linux解压jar 编辑:程序博客网 时间:2024/05/29 17:42
package com.stucture.list.linkList;  /**  * 单链表  * @ClassName: LinkList   * @author 景帅 * @date 2015-2-13  */  public class LinkList<T>{      private Node<T> head; //链表的结点      private int length; //链表的长度            public LinkList(Node<T> head) {          this.head = head;      }    /**      * 头插法初始化     * @param initsu 需要插入的对象数组     * @return       */      public void topinit(T initsu[]){    Node<T> newnode = null;    Node<T> oldnode = null;    for (T i : initsu) {//1     if(head==null){    head = new Node<T>(); //第一次使用,必须创建对象                 oldnode = head;    }   newnode = new Node<T>(); //创建新节点 new 2 old 7 17   newnode.setData(i);    newnode.setNext(oldnode.getNext());//new 17 old 7   oldnode.setNext(newnode);//new 17 old 7 17               length++;}        }    /**      * 尾插法初始化     * @param initsu 需要插入的对象数组     * @return       */     public void tailinit(T initsu[]){    Node<T> p = null;    Node<T> p2 = null;    for (T i : initsu) {//1 2    if(head==null){    head = new Node<T>(); //第一次使用,必须创建对象     head.setNext(null);    p2 = head;    }    p = new Node<T>(); //创建新节点    p.setData(i);    p2.setNext(p);    //p.setNext(head.getNext());    //head.setNext(p);    p2 = p;    length++;    }        }    /**      * 获得元素      * @param loc 需要获得的第loc个元素      * @return       */       public T getElem(int loc) {          int j = 1;  //计数器          Node<T> n = head; //指向第一个结点                    while(n != null) {  //n不为空时,循环继续寻找第loc个结点              if(j == loc) {  //找到第一个元素时返回                  return n.getData();              }              n = n.getNext();              j++;                        }          return null;      }      /**      * 插入元素      * @param loc 元素的插入位置      * @param t 需要插入的元素      * @return  是否成功插入      */     public boolean insertElem(int loc, T t) {          if(length + 1 < loc) {              System.out.println("非法插入");              return false;          }          if(head == null && loc == 1) {  //当第一次插入的时候              head = new Node<T>(); //第一次使用,必须创建对象              head.setData(t);              length++;          } else if(head != null && loc == 1) {   //但不是第一次插入,但是插入的位置是第一个时              Node<T> tempNode = new Node<T>();   //生成一个新的结点              tempNode.setData(t);              tempNode.setNext(head);               head = tempNode;    //把头换成新插入的结点              length++;          } else {    //当不是第一次插入并且插入的不是第一个时              Node<T> n = this.head;              int j = 1;  //计数器              while(n != null && j < loc - 1) {                  n = n.getNext();                  j++;              }              Node<T> tempNode = new Node<T>();   //生成一个新的结点              tempNode.setData(t);              tempNode.setNext(n.getNext());  //将n的后继结点赋值给新的结点的后继   1 2 3 4 5 6                 n.setNext(tempNode);              length++;          }          return true;      }      /**      * 删除元素      * @param i 需要删除元素的位置      * @return      */     public T deleteElem(int loc) {          if(head == null || loc > length) {              System.out.println("非法删除");              return null;          }          T old;          if(head != null && loc == 1) {              old = head.getData();              head = head.getNext();                        } else {              Node<T> n = this.head;              int j = 1;  //计数器              while(n != null && j < loc - 1) {                  n = n.getNext();                  j++;              }              old = n.getNext().getData();              n.setNext(n.getNext().getNext());          }          length--;          return old;      }            public Node<T> getHead() {          return head;      }      public void setHead(Node<T> head) {          this.head = head;      }      public int getLength() {          return length;      }      public void setLength(int length) {          this.length = length;      }        } /**  * 链表中的结点  * @ClassName: Node   * @author 景帅  * @date 2015-2-13  */  class Node<T> {      private T data;       //需要存储的数据信息      private Node<T> next;           public T getData() {          return data;      }      public void setData(T data) {          this.data = data;      }      public Node<T> getNext() {          return next;      }      public void setNext(Node<T> next) {          this.next = next;      }              }

调用代码

package com.stucture.list.linkList;   import java.util.Random;   public class LinkListTest {      final int MAX = 25;      Random r = new Random();      LinkList<Integer> linkList;            public LinkListTest() {          //initSeqList();      }            //创建一个线性表顺序存储结构      public void initSeqList() {          linkList = new LinkList<Integer>(null);           Integer s[] = new Integer[10];        for (int i = 1; i <= 10; i++) {  //为生成的链表赋值,同时也测试了插入值的方法              int j =r.nextInt(MAX);            System.out.print(j+" ");            s[i-1] = j;          }        System.out.println();        //linkList.topinit(s);        linkList.tailinit(s);                System.out.println("\n原始链表是 :");          display(linkList);      }            //测试删除方法      public void deleteElem() {          int i = r.nextInt(MAX);          System.out.println("\n\n删除的位置是:" + i);          Integer deleteNumber = linkList.deleteElem(i);                    if( deleteNumber == null) {              System.exit(0);          } else {              System.out.println("删除的元素是 : " + deleteNumber);              System.out.println("删除元素后链表是 :");              display(linkList);          }      }            //测试随机插入方法      public void insertByRandom() {          int i = r.nextInt(MAX);          System.out.println("\n\n随机插入位置是 :" + i);          int elem = r.nextInt(MAX);          System.out.println("随机插入数据是 :" + elem);          linkList.insertElem(i, elem);          System.out.println("随机插入数据后链表是 :");          display(linkList);      }            //数据展示      public  void display(LinkList<Integer> linkList) {          Node<Integer> node = linkList.getHead();          while(node != null) {              System.out.print(node.getData() + " ");              node = node.getNext();          }          System.out.println("链表的长度为 :" + linkList.getLength());      }            //获取元素      public void getElem() {          int i = r.nextInt(MAX);          System.out.println("\n获取位置为 :" + i);          System.out.println("获取到的元素为 : " + linkList.getElem(i));                          }            public static void main(String[] args) {          LinkListTest s = new LinkListTest();          /*s.insertByRandom();          s.deleteElem();          s.getElem(); */        s.initSeqList();    }  } 



0 0
原创粉丝点击