国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

Java模擬有序鏈表數據結構的示例

2019-11-26 14:26:24
字體:
來源:轉載
供稿:網友

有序鏈表:
按關鍵值排序。刪除鏈頭時,就刪除最小(/最大)的值,插入時,搜索插入的位置。
插入時需要比較O(N),平均O(N/2),刪除最小(/最大)的在鏈頭的數據時效率為O(1),
如果一個應用需要頻繁的存取(插入/查找/刪除)最小(/最大)的數據項,那么有序鏈表是一個不錯的選擇
優先級隊列 可以使用有序鏈表來實現
有序鏈表的插入排序:
對一個無序數組,用有序鏈表來排序,比較的時間級還是O(N^2)
復制時間級為O(2*N),因為復制的次數較少,第一次放進鏈表數據移動N次,再從鏈表復制到數組,又是N次
每插入一個新的鏈結點,不需要復制移動數據,只需要改變一兩個鏈結點的鏈域

import java.util.Arrays; import java.util.Random;  /**  * 有序鏈表 對數組進行插入排序  * @author stone  */ public class LinkedListInsertSort<T extends Comparable<T>> {      private Link<T> first;    //首結點   public LinkedListInsertSort() {        }      public boolean isEmpty() {     return first == null;   }      public void sortList(T[] ary) {     if (ary == null) {       return;     }     //將數組元素插入進鏈表,以有序鏈表進行排序     for (T data : ary) {       insert(data);     }     //        }      public void insert(T data) {// 插入 到 鏈頭, 以從小到大排序     Link<T> newLink = new Link<T>(data);     Link<T> current = first, previous = null;     while (current != null && data.compareTo(current.data) > 0) {       previous = current;       current = current.next;     }     if (previous == null) {       first = newLink;     } else {       previous.next = newLink;     }     newLink.next = current;   }      public Link<T> deleteFirst() {//刪除 鏈頭     Link<T> temp = first;     first = first.next; //變更首結點,為下一結點     return temp;   }      public Link<T> find(T t) {     Link<T> find = first;     while (find != null) {       if (!find.data.equals(t)) {         find = find.next;       } else {         break;       }     }     return find;   }      public Link<T> delete(T t) {     if (isEmpty()) {       return null;     } else {       if (first.data.equals(t)) {         Link<T> temp = first;         first = first.next; //變更首結點,為下一結點         return temp;       }     }     Link<T> p = first;     Link<T> q = first;     while (!p.data.equals(t)) {       if (p.next == null) {//表示到鏈尾還沒找到         return null;       } else {         q = p;         p = p.next;       }     }          q.next = p.next;     return p;   }      public void displayList() {//遍歷     System.out.println("List (first-->last):");     Link<T> current = first;     while (current != null) {       current.displayLink();       current = current.next;     }   }      public void displayListReverse() {//反序遍歷     Link<T> p = first, q = first.next, t;     while (q != null) {//指針反向,遍歷的數據順序向后       t = q.next; //no3       if (p == first) {// 當為原來的頭時,頭的.next應該置空         p.next = null;       }       q.next = p;// no3 -> no1 pointer reverse       p = q; //start is reverse       q = t; //no3 start     }     //上面循環中的if里,把first.next 置空了, 而當q為null不執行循環時,p就為原來的最且一個數據項,反轉后把p賦給first     first = p;      displayList();   }      class Link<T> {//鏈結點     T data;   //數據域     Link<T> next; //后繼指針,結點    鏈域     Link(T data) {       this.data = data;     }     void displayLink() {       System.out.println("the data is " + data.toString());     }   }      public static void main(String[] args) {     LinkedListInsertSort<Integer> list = new LinkedListInsertSort<Integer>();     Random random = new Random();     int len = 5;     Integer[] ary = new Integer[len];     for (int i = 0; i < len; i++) {       ary[i] = random.nextInt(1000);     }     System.out.println("----排序前----");     System.out.println(Arrays.toString(ary));     System.out.println("----鏈表排序后----");     list.sortList(ary);     list.displayList();   } } 


打印

----排序前---- [595, 725, 310, 702, 444] ----鏈表排序后---- List (first-->last): the data is 310 the data is 444 the data is 595 the data is 702 the data is 725 

單鏈表反序:

public class SingleLinkedListReverse {      public static void main(String[] args) {     Node head = new Node(0);     Node temp = null;     Node cur = null;          for (int i = 1; i <= 10; i++) {       temp = new Node(i);       if (i == 1) {         head.setNext(temp);       } else {         cur.setNext(temp);       }       cur = temp;     }//10.next = null;          Node h = head;     while (h != null) {       System.out.print(h.getData() + "/t");       h = h.getNext();     }     System.out.println();          //反轉1 //   h = Node.reverse1(head); //   while (h != null) { //     System.out.print(h.getData() + "/t"); //     h = h.getNext(); //   }          //反轉2     h = Node.reverse1(head);     while (h != null) {       System.out.print(h.getData() + "/t");       h = h.getNext();     }             } }  /*  * 單鏈表的每個節點都含有指向下一個節點屬性  */ class Node {   Object data;//數據對象    Node next; //下一節點      Node(Object d) {     this.data = d;   }   Node(Object d, Node n) {     this.data = d;     this.next = n;   }   public Object getData() {     return data;   }   public void setData(Object data) {     this.data = data;   }   public Node getNext() {     return next;   }   public void setNext(Node next) {     this.next = next;   }   //方法1 head被重置   static Node reverse1(Node head) {      Node p = null; //反轉后新的 頭     Node q = head;     //輪換結果:012,123,234,.... 10 null null     while (head.next != null) {       p = head.next;   // 第1個 換成第2個 這時p表示原始序列頭中的next       head.next = p.next; // 第2個 換成第3個       p.next = q;     //已經跑到第1位置的原第2個的下一個 就要變成 原第1個       q = p;       //新的第1個 要變成 當前第一個     }     return p;        }   //方法2 head沒重置   static Node reverse2(Node head) {     //將中間節點的指針指向前一個節點之后仍然可以繼續向后遍歷鏈表     Node p1 = head, p2 = head.next, p3; // 前 中 后     //輪換結果 :012, 123, 234, 345, 456.... 9 10 null     while (p2 != null) {       p3 = p2.next;        p2.next = p1; //指向后 變 指向前       p1 = p2;   //2、3向前挪       p2 = p3;     }     head.next = null;//head沒變,當輸出到0時,再請求0.next 為1     return p1;   } } 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 绥江县| 重庆市| 吉安县| 太保市| 舞阳县| 鹰潭市| 海口市| 云浮市| 新平| 大荔县| 娄烦县| 灵石县| 镇原县| 华池县| 大悟县| 新巴尔虎右旗| 聂拉木县| 习水县| 彭泽县| 瓦房店市| 永年县| 嘉黎县| 宝清县| 高安市| 太白县| 滦南县| 元阳县| 蓝山县| 中方县| 甘南县| 卢龙县| 紫金县| 锦屏县| 南宁市| 南和县| 潜江市| 建昌县| 亳州市| 神农架林区| 漯河市| 临海市|