java-------單鏈表

来源:http://www.cnblogs.com/gdy1993/archive/2017/06/05/6947207.html
-Advertisement-
Play Games

單鏈表: * 1.鏈表可以是一種有序或無序的列表 * 2.鏈表的內容通常存儲在記憶體中分散的為止 * 3.鏈表由節點組成,每一個節點具有相同的結構 * 4.節點分為數據域和鏈域,數據域存放節點內容,鏈域存放下一個節點的指針 package myLinkList; public class MyLink ...


單鏈表:
* 1.鏈表可以是一種有序或無序的列表
* 2.鏈表的內容通常存儲在記憶體中分散的為止
* 3.鏈表由節點組成,每一個節點具有相同的結構
* 4.節點分為數據域和鏈域,數據域存放節點內容,鏈域存放下一個節點的指針

 

package myLinkList;

public class MyLinkedList<T> {

/**
*Node:節點對象
* 包括數據域data和鏈域next(指向下一個節點對象)
*/
class Node {
  private T data;
  private Node next;
  public Node(){

  }
  //節點初始化
  public Node(T data,Node next){
    this.data = data;
    this.next = next;
  }
}

private Node header;//鏈表頭節點
private Node tailer;//鏈表尾節點
private int size;//鏈表長度(節點個數)


/**
* 鏈表初始化
*/
public MyLinkedList() {//空參構造
  header = null;
  tailer = null;
}
public MyLinkedList(T data) {//有參構造
  header = new Node(data,null);//創建頭結點
  tailer = header;
  size++;
}

/**
* 求鏈表長度
* @return
*/
public int getSize() {
  return size;
}

/**
* 返回索引為index的節點的數據
* @param index 索引
* @return
*/
public T get(int index) {
  if(index < 0 || index > size-1)
    throw new IndexOutOfBoundsException("索引越界");
  return getIndexNode(index).data;
}

public Node getIndexNode(int index){
  if(index < 0 || index > size-1)
    throw new IndexOutOfBoundsException("索引越界");
  Node current = header;
  for(int i = 0;i < size; i++) {
    if(i == index) {
    return current;
  }
  current = current.next;
}
  return null;
}

/**
* 返回element在在鏈表位置,如果不存在,則返回-1
* @param tdata
* @return
*/
public int getIndex(T element) {
  if(element == null)
    return -1;
  Node current = header;
  for(int i = 0; i < size; i++) {
    if(current.data == element){
    return i;
  }
  current = current.next;
}
  return -1;
}



/**
* 在鏈表末端添加element
* @param element
*/
public void add(T element) {
  Node n = new Node(element,null);
  if(header == null){
  header = n;
  tailer = header;
}else{
  tailer.next = n;
  tailer = n;
}
  size++;
}

/**
* 在鏈表頭部添加element
* @param element
*/
public void addAtheader(T element) {
  header = new Node(element,header);
  if(tailer == null){
    tailer = header;
  }
  size++;
}

/**
* 在index位置後邊插入元素
* @param index
* @param element
*/
public void insert(int index,T element) {
  if(index<0 || index>size-1) {
    throw new IndexOutOfBoundsException("索引越界");
  }
  if(header==null){
    add(element);
  }else{
    if(index==0){
    addAtheader(element);
  }else{
      Node current = getIndexNode(index);
      Node insertNode = new Node(element,current.next);
      current.next = insertNode;
      size++;
    }
  }
}
/**
* 刪除任意位置的節點
* @param index
* @return
*/
public T deleteNode(int index){
  if(index<0 || index>size-1)
    throw new IndexOutOfBoundsException("索引越界");
  if(index == 0){//在頭部刪除元素
    Node n = header;//記錄頭節點
    header = header.next;//將頭指針指向下一個節點
    size--;
    return n.data;//輸出記錄節點的內容
  }else{//在其他位置刪除
    Node current = getIndexNode(index);//獲取當前節點
    Node pre = getIndexNode(index-1);//獲取前一個節點
    pre.next = current.next;//將前一個節點的鏈域設為null
    size--;
    return current.data;//返回刪除節點的數據域
  }


}
/**
* 刪除頭節點
* @return
*/
public T deleteHeader(){
  return deleteNode(0);
}
/**
* 刪除尾節點
* @return
*/
public T deleteTailer(){
return deleteNode(size-1);
}

//清空節點
public void clear(){
  header = null;
  tailer = null;
  size = 0;
}

/**
* toString();
*/
public String toString(){
  if(size == 0)
    return "[]";
  Node current = header;
  StringBuilder sb = new StringBuilder();
  sb.append("[");
  while(current.next != null) {
    sb.append(current.data).append(" ");
    current = current.next;
  }
  sb.append(current.data).append("]");
  return sb.toString();
}


public static void main(String[] args) {
  MyLinkedList<String> link = new MyLinkedList<>();
  link.add("header");
  link.add("11");
  link.add("22");
  link.add("33");
  link.addAtheader("newheader");
  link.insert(2, "1.5");;

  System.out.println(link.getIndex("11"));
  System.out.println(link.getIndex("88"));
  System.out.println(link.get(0));
  System.out.println(link.getSize());
  System.out.println(link.deleteHeader());
  System.out.println(link.deleteTailer());
  System.out.println(link.deleteNode(1));
  System.out.println(link);
  link.clear();
  System.out.println(link);

  }

}


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Description Andy, 8, has a dream - he wants to produce his very own dictionary. This is not an easy task for him, as the number of words that he knows ...
  • 轉載:多看看會有新收穫 1、Java面試題全集(上) 2、Java面試題全集(中) 3、Java面試題全集(下) ...
  • 還是以上次的洗衣機例子: 輸出結果: 下麵講類方法: 做個作業吧。 ...
  • request = $request; } abstract function process(); function forward($resource){ //跳轉 include($resource); exit(0); } function getRequest(){ ... ...
  • 前言 上一篇對Digester做了基本介紹,也已經瞭解了Digester的基本使用方法,接下來將繼續學習其相關特性,本篇主要涉及以下幾個內容: 規則模塊預先綁定 - RulesModule介面 在此之前,我們使用Digester的基本流程都是每次在程式運行時綁定規則,然後解析; 事實上,我們可以改變 ...
  • 創建一個子類對象會不會創建父類對象? 不會,只創建了一個子類對象,但是往父類對象的構造方法里傳了子類對象的地址;給子類對象初始化的時候,調用了父類的構造方法。 證明: 結果: A==366712642 B==366712642 如果子類對象創建的同時也創建了一個父類對象,那麼父類和子類構造方法中th ...
  • 在互動式環境中輸入: 如下圖: 還是在互動式環境中: 圖片展示: 這種反射機制的用字元串來操作類的屬性和方法的三個函數並不常用。編寫框架等特殊項目是採用到。 但這時用戶仍然可以通過w._water來訪問實例屬性,封裝的不好,也不會自動檢查數據是不是浮點型,不好。 怎麼解決? 用@屬性.setter ...
  • 一.概念 反射就是把Java的各種成分映射成相應的Java類。 Class類的構造方法是private,由JVM創建。 反射是java語言的一個特性,它允程式在運行時(註意不是編譯的時候)來進行自我檢查並且對內部的成員進行操作。例如它允許一個java的類獲取他所有的成員變數和方法並且顯示出來。Jav ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...