最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java模擬有序鏈表數(shù)據(jù)結構的示例

 更新時間:2016年04月18日 08:43:25   作者:匆忙擁擠repeat  
這篇文章主要介紹了Java模擬有序鏈表數(shù)據(jù)結構的示例,包括一個反序的單鏈表結構的例子,需要的朋友可以參考下

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

import java.util.Arrays; 
import java.util.Random; 
 
/** 
 * 有序鏈表 對數(shù)組進行插入排序 
 * @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; 
    } 
    //將數(shù)組元素插入進鏈表,以有序鏈表進行排序 
    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) {//指針反向,遍歷的數(shù)據(jù)順序向后 
      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 
    } 
    //上面循環(huán)中的if里,把first.next 置空了, 而當q為null不執(zhí)行循環(huán)時,p就為原來的最且一個數(shù)據(jù)項,反轉(zhuǎn)后把p賦給first 
    first = p;  
    displayList(); 
  } 
   
  class Link<T> {//鏈結點 
    T data;   //數(shù)據(jù)域 
    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(); 
     
    //反轉(zhuǎn)1 
//   h = Node.reverse1(head); 
//   while (h != null) { 
//     System.out.print(h.getData() + "\t"); 
//     h = h.getNext(); 
//   } 
     
    //反轉(zhuǎn)2 
    h = Node.reverse1(head); 
    while (h != null) { 
      System.out.print(h.getData() + "\t"); 
      h = h.getNext(); 
    } 
     
     
  } 
} 
 
/* 
 * 單鏈表的每個節(jié)點都含有指向下一個節(jié)點屬性 
 */ 
class Node { 
  Object data;//數(shù)據(jù)對象  
  Node next; //下一節(jié)點 
   
  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; //反轉(zhuǎn)后新的 頭 
    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;     //已經(jīng)跑到第1位置的原第2個的下一個 就要變成 原第1個 
      q = p;       //新的第1個 要變成 當前第一個 
    } 
    return p; 
     
  } 
  //方法2 head沒重置 
  static Node reverse2(Node head) { 
    //將中間節(jié)點的指針指向前一個節(jié)點之后仍然可以繼續(xù)向后遍歷鏈表 
    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; 
  } 
} 

相關文章

  • springboot整合SSE技術開發(fā)小結

    springboot整合SSE技術開發(fā)小結

    本文主要介紹了springboot整合SSE技術開發(fā)小結,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-11-11
  • Centos 7 安裝 OpenJDK 11 兩種方式及問題小結

    Centos 7 安裝 OpenJDK 11 兩種方式及問題小結

    這篇文章主要介紹了Centos 7 安裝 OpenJDK 11 兩種方式,第一種方式使用yum安裝,第二種方式使用tar解壓安裝,每種方法給大家介紹的非常詳細,需要的朋友可以參考下
    2021-09-09
  • SpringBoot隨機端口啟動的實現(xiàn)

    SpringBoot隨機端口啟動的實現(xiàn)

    本文主要介紹了SpringBoot隨機端口啟動的實現(xiàn),文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學習學習吧
    2021-07-07
  • SpringBoot?MP簡單的分頁查詢測試實現(xiàn)步驟分解

    SpringBoot?MP簡單的分頁查詢測試實現(xiàn)步驟分解

    好久沒水后端的東西了,最近在做vue項目寫前端的代碼,所以cloud也停進度了,吃完飯突然記得我沒有在博客里寫分頁的東西,雖然項目中用到了,但是沒有拎出來,這里就拎出來看看
    2023-04-04
  • Mybatis-plus 雙主鍵的實現(xiàn)示例

    Mybatis-plus 雙主鍵的實現(xiàn)示例

    本文主要介紹了Mybatis-plus 雙主鍵的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-05-05
  • Java實戰(zhàn)之郵件的撰寫和發(fā)送

    Java實戰(zhàn)之郵件的撰寫和發(fā)送

    這篇文章主要為大家詳細介紹了通過Java代碼實現(xiàn)郵件的撰寫和發(fā)送功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,需要的小伙伴們可以學習一下
    2021-11-11
  • Spring Security如何在Servlet中執(zhí)行

    Spring Security如何在Servlet中執(zhí)行

    這篇文章主要介紹了Spring Security如何在Servlet中執(zhí)行,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-04-04
  • java集合Collection實現(xiàn)類解析ArrayList?LinkedList及Vector

    java集合Collection實現(xiàn)類解析ArrayList?LinkedList及Vector

    這篇文章主要為大家介紹了java集合Collection實現(xiàn)類解析ArrayList?LinkedList及Vector,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2022-03-03
  • Java RPC框架如何實現(xiàn)客戶端限流配置

    Java RPC框架如何實現(xiàn)客戶端限流配置

    這篇文章主要介紹了Java RPC框架如何實現(xiàn)客戶端限流配置,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-02-02
  • 淺談Mybatis樂觀鎖插件

    淺談Mybatis樂觀鎖插件

    這篇文章主要介紹了淺談Mybatis樂觀鎖插件,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-12-12

最新評論

西安市| 沂南县| 东方市| 汽车| 安丘市| 柳林县| 娱乐| 盈江县| 隆林| 和林格尔县| 和硕县| 扬中市| 萝北县| 兖州市| 青龙| 渑池县| 遂平县| 长海县| 正定县| 沂水县| 奉新县| 麻城市| 于田县| 洛隆县| 宜春市| 邢台县| 阿尔山市| 宣城市| 金湖县| 赤壁市| 潼关县| 巴南区| 陆河县| 辽阳县| 东光县| 闻喜县| 乐业县| 汶上县| 宜城市| 平邑县| 潍坊市|