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

用Java實(shí)現(xiàn)一個(gè)靜態(tài)鏈表的方法步驟

 更新時(shí)間:2020年02月11日 09:38:21   作者:孫華棟  
這篇文章主要介紹了用Java實(shí)現(xiàn)一個(gè)靜態(tài)鏈表的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

什么是靜態(tài)鏈表?

對(duì)于線性鏈表,也可用一維數(shù)組來(lái)進(jìn)行描述。這種描述方法便于在沒有指針類型的高級(jí)程序設(shè)計(jì)語(yǔ)言中使用鏈表結(jié)構(gòu)。

用數(shù)組描述的鏈表,即稱為靜態(tài)鏈表。

在C語(yǔ)言中,靜態(tài)鏈表的表現(xiàn)形式即為結(jié)構(gòu)體數(shù)組,結(jié)構(gòu)體變量包括數(shù)據(jù)域data和游標(biāo)CUR。

靜態(tài)鏈表的節(jié)點(diǎn)

數(shù)據(jù)域:用于存儲(chǔ)數(shù)據(jù)元素的值
游標(biāo):即數(shù)組下標(biāo),表示直接后繼元素所在數(shù)組中的位置

public class StaticLinkedListNode<T> { 
  public T data; // 數(shù)據(jù)
  public int cursor; // 游標(biāo)
  ...
}

注:通常靜態(tài)鏈表會(huì)將第一個(gè)數(shù)據(jù)元素放到數(shù)組下標(biāo)為1(即a[1])的位置中。

備用鏈表

靜態(tài)鏈表中,除了數(shù)據(jù)本身通過(guò)游標(biāo)組成鏈表外,還需要有一條連接各個(gè)空閑位置的鏈表,稱為備用鏈表。

作用:回收數(shù)組中未使用或者之前使用過(guò)(現(xiàn)在不用)的存儲(chǔ)空間,留待后期使用。即靜態(tài)鏈表使用數(shù)組申請(qǐng)的物理空間中,存在兩個(gè)鏈表,一條連接數(shù)據(jù),另一條連接數(shù)組中為使用的空間。

注:通常備用鏈表的表頭位于數(shù)組下標(biāo)為0(a[0])的位置,而數(shù)據(jù)鏈表的表頭位于數(shù)組下標(biāo)為1(a[1])的位置。

靜態(tài)鏈表中設(shè)置備用鏈表的好處是,可以清楚地知道數(shù)組中是否有空閑位置,以便數(shù)據(jù)鏈表添加新數(shù)據(jù)時(shí)使用。比如,若靜態(tài)鏈表中數(shù)組下標(biāo)為 0 的位置上存有數(shù)據(jù),則證明數(shù)組已滿。

完整代碼

public class StaticLinkedListNode<T> {
  public T data;
  private int cursor;

  public StaticLinkedListNode(T data, int cursor) {
    this.cursor = cursor;
  }

  public T getData() {
    return data;
  }

  public void setData(T data) {
    this.data = data;
  }

  public int getCursor() {
    return cursor;
  }

  public void setCursor(int cursor) {
    this.cursor = cursor;
  }
}

public class StaticLinkedList<T> {
  StaticLinkedListNode[] nodes;
  private static final int MAX_SIZE = 100;
  private int length;

  public StaticLinkedList() {
    nodes = new StaticLinkedListNode[MAX_SIZE];
    for (int i = 0; i < MAX_SIZE; i++) {
      nodes[i] = new StaticLinkedListNode<T>(null, i + 1);
    }
    nodes[MAX_SIZE - 1].setCursor(0);
    this.length = 0;
  }

  // 鏈表實(shí)際長(zhǎng)度
  public int Length() {
    return length;
  }

  // 判斷使用數(shù)組是否為空
  public boolean isEmpty() {
    return length == 0;
  }

  // 判斷備用鏈表是否為空
  public boolean isFull() {
    return length == MAX_SIZE;
  }

  // 插入一個(gè)節(jié)點(diǎn)
  public boolean addTo(T data, int index) {
    if (isFull() || index > MAX_SIZE || index < -1 || data == null)
      return false;
    if (index == 0) {
      insert(data);
      return true;
    }
    if (index > Length()) {
      index = Length();
    }
    // 獲取第一個(gè)使用節(jié)點(diǎn)的下標(biāo)
    int firstUse = nodes[MAX_SIZE - 1].getCursor();
    // 獲取備用數(shù)組第一個(gè)節(jié)點(diǎn)的下標(biāo)
    int firstNull = nodes[0].getCursor();
    for (int i = 1; i < index; i++) {
      firstUse = nodes[firstUse].getCursor();
    }
    // 獲取目標(biāo)節(jié)點(diǎn)的后續(xù)節(jié)點(diǎn)
    int nextUse = nodes[firstUse].getCursor();
    int nextNull = nodes[firstNull].getCursor();
    nodes[0].setCursor(nextNull);
    nodes[firstUse].setCursor(firstNull);
    nodes[firstNull].setCursor(nextUse);
    nodes[firstNull].setData(data);
    length++;
    return true;
  }

  public void insert(T data) {
    int t = nodes[MAX_SIZE - 1].getCursor();
    int firstNull = nodes[0].getCursor();
    nodes[MAX_SIZE - 1].setCursor(firstNull);
    nodes[0].setCursor(nodes[firstNull].getCursor());
    nodes[firstNull].setCursor(t);
    nodes[firstNull].setData(data);
    length++;
  }

  public void print() {
    int first = nodes[MAX_SIZE - 1].getCursor();
    System.out.println("鏈表:");
    for (int i = first; i != 0; ) {
      System.out.print(nodes[i].getData() + " ");
      i = nodes[i].getCursor();
    }
  }

  // 刪除指定節(jié)點(diǎn)
  public boolean delete(T data) {
    if (isEmpty()) {
      return false;
    }
    int temp = MAX_SIZE - 1;
    while (temp != 0) {
      if (nodes[nodes[temp].getCursor()].getData() == data) {
        int p = nodes[temp].getCursor();
        nodes[temp].setCursor(nodes[p].getCursor());
        nodes[p].setCursor(nodes[0].getCursor());
        nodes[0].setCursor(p);
        nodes[p].setData(null);
        length--;
        return true;
      }
      temp = nodes[temp].getCursor();
    }
    return false;
  }

  // 刪除所有節(jié)點(diǎn)
  public boolean deleteAll() {
    if (isEmpty()) {
      return true;
    }
    for (int i = 0; i < MAX_SIZE - 1; i++) {
      nodes[i].setCursor(i + 1);
      nodes[i].setData(null);
    }
    nodes[MAX_SIZE - 1].setCursor(0);
    nodes[MAX_SIZE - 1].setData(null);
    length = 0;
    return true;
  }

  public void printAll() {
    System.out.println("鏈表:");
    for (int i = 0; i < MAX_SIZE; i++) {
      System.out.print("[" + i + " " + nodes[i].getData() + " " + nodes[i].getCursor() + "]");
      if (i % 5 == 0 && i != 0) {
        System.out.println();
      }
    }
  }

  public static void main(String[] args) {
    StaticLinkedList<String> list = new StaticLinkedList<String>();
    list.insert("A");
    list.insert("B");
    list.insert("C");
    list.insert("D");
    list.insert("E");
    list.addTo("X", 2);
    System.out.println(list.Length());
    list.print();
//    list.printAll();
//    list.deleteAll();
  }
}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • js判斷是否是移動(dòng)設(shè)備登陸網(wǎng)頁(yè)的簡(jiǎn)單方法

    js判斷是否是移動(dòng)設(shè)備登陸網(wǎng)頁(yè)的簡(jiǎn)單方法

    這篇文章主要介紹了js判斷是否是移動(dòng)設(shè)備登陸網(wǎng)頁(yè)的簡(jiǎn)單方法,需要的朋友可以參考下
    2014-02-02
  • 圖解Java排序算法之歸并排序

    圖解Java排序算法之歸并排序

    這篇文章主要為大家詳細(xì)介紹了Java經(jīng)典排序算法之歸并排序,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • C#中NAudio音頻庫(kù)的安裝與使用教程詳解

    C#中NAudio音頻庫(kù)的安裝與使用教程詳解

    NAudio為.NET平臺(tái)下的開源庫(kù),采用ML-PL協(xié)議,它支持許多音頻操作,可實(shí)現(xiàn)多種API播放與錄制、多種不同音頻格式等功能,下面就跟隨小編一起學(xué)習(xí)一下NAudio的安裝與使用吧
    2023-11-11
  • Spring中的Aware接口詳細(xì)解析

    Spring中的Aware接口詳細(xì)解析

    這篇文章主要介紹了Spring中的Aware接口詳細(xì)解析,Aware是一個(gè)具有標(biāo)識(shí)作用的超級(jí)接口,具體實(shí)現(xiàn)是有子接口去決定的,但是子接口至少要有一個(gè)帶一個(gè)參數(shù)的且返回是空的方法,需要的朋友可以參考下
    2023-12-12
  • Java為何需要平衡方法調(diào)用與內(nèi)聯(lián)

    Java為何需要平衡方法調(diào)用與內(nèi)聯(lián)

    這篇文章主要介紹了Java為何需要平衡方法調(diào)用與內(nèi)聯(lián),幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2021-01-01
  • Spring Boot與Kotlin 整合全文搜索引擎Elasticsearch的示例代碼

    Spring Boot與Kotlin 整合全文搜索引擎Elasticsearch的示例代碼

    本篇文章主要介紹了Spring Boot與Kotlin 整合全文搜索引擎Elasticsearch的示例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • javaSE基礎(chǔ)java自定義注解原理分析

    javaSE基礎(chǔ)java自定義注解原理分析

    這篇文章主要介紹了javaSE基礎(chǔ)對(duì)java自定義注解原理分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多度進(jìn)步,早日升職加薪
    2021-10-10
  • Spring?Batch實(shí)現(xiàn)批量處理

    Spring?Batch實(shí)現(xiàn)批量處理

    本文主要介紹了Spring?Batch進(jìn)行批量處理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • Idea如何導(dǎo)入一個(gè)SpringBoot項(xiàng)目的方法(圖文教程)

    Idea如何導(dǎo)入一個(gè)SpringBoot項(xiàng)目的方法(圖文教程)

    這篇文章主要介紹了Idea如何導(dǎo)入一個(gè)SpringBoot項(xiàng)目的方法(圖文教程),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • 深入分析RabbitMQ中死信隊(duì)列與死信交換機(jī)

    深入分析RabbitMQ中死信隊(duì)列與死信交換機(jī)

    這篇文章主要介紹了RabbitMQ中死信隊(duì)列與死信交換機(jī),死信隊(duì)列就是一個(gè)普通的交換機(jī),有些隊(duì)列的消息成為死信后,一般情況下會(huì)被RabbitMQ清理,感興趣想要詳細(xì)了解可以參考下文
    2023-05-05

最新評(píng)論

华安县| 若羌县| 郸城县| 五原县| 汽车| 玛沁县| 镇雄县| 常熟市| 泗水县| 敦化市| 微山县| 繁昌县| 图们市| 涿鹿县| 盈江县| 镇安县| 青岛市| 黄浦区| 锦州市| 阿荣旗| 武安市| 天门市| 樟树市| 合川市| 龙门县| 新乡县| 尉犁县| 通海县| 通化县| 蕉岭县| 冷水江市| 鸡东县| 安乡县| 瑞安市| 察雅县| 凌云县| 军事| 云和县| 镇原县| 武定县| 乐陵市|