單向鍊錶(單鏈表)是鍊錶的一種,其特點是鍊錶的鏈結方向是單向的,對鍊錶的訪問要通過順序讀取從頭部開始。
鏈式儲存結構的線性表將採用一組任意的儲存單元存放線性表中的資料元素。由於不需要按順序儲存,鍊錶在插入、刪除資料元素時比順序儲存要快,但是在查詢乙個節點時則要比順序儲存要慢。
使用鏈式儲存可以克服順序線性表需要預先知道資料大小的缺點,鍊錶結構可以充分利用記憶體空間,實現靈活的記憶體動態管理。但是鏈式儲存失去了陣列隨機訪問的特點,同時增加了節點的指標域,空間開銷較大。
下圖就是最簡單最一般的單向鍊錶:
新增節點:
將值為element的新節點插入到第index的位置上。
首先要先找到索引為index-1的節點,然後生成乙個資料為element的新節點newnode,並令index-1處節點的next指向新節點,新節點的next指向原來index處的節點。
刪除節點:
刪除第index個節點,第index節點是由index-1出的節點引用的,因此刪除index的節點要先獲取index-1處的節點,然後讓index-1出節點的next引用到原index+1處的節點,並釋放index處節點即可。
下面的程式分別實現了線性表的初始化、獲取線性表長度、獲取指定索引處元素、根據值查詢、插入、刪除、清空等操作。
package com.liuhao.algorithm;
public class linklist
// 初始化全部屬性的構造器
public node(t data, node next)
} private node header;// 儲存頭結點
private node tail;// 儲存尾節點
private int size;// 儲存已含有的節點數
// 建立空鍊錶
public linklist()
// 已指定資料元素建立鍊錶,只有乙個元素
public linklist(t element)
// 返回鍊錶的長度
public int length()
// 獲取指定索引處的元素
public t get(int index)
//獲取指定位置的節點
private node getnodebyindex(int index)
node current = header;//從header開始遍歷
for(int i=0; isize)
//如果是空鍊錶
if(header == null)
else
else
} }//在尾部插入元素
public void add(t element)
else
size++; }
//頭部插入
public void addathead(t element)
size++; }
//刪除指定索引處的元素
public t delete(int index)
node del = null;
//若要刪除的是頭節點
if(index == 0)
else
size--;
return del.data; }
//刪除最後乙個元素
public t remove()
//判斷線性表是否為空
public boolean isempty()
//清空線性表
public void clear()
public string tostring()
else
int len = sb.length();}}
}
package com.liuhao.test;
import org.junit.test;
import com.liuhao.algorithm.linklist;
public class linklisttest
}
線性表的Java實現 鏈式儲存(單向鍊錶)
單向鍊錶 單鏈表 是鍊錶的一種,其特點是鍊錶的鏈結方向是單向的,對鍊錶的訪問要通過順序讀取從頭部開始。鏈式儲存結構的線性表將採用一組任意的儲存單元存放線性表中的資料元素。由於不需要按順序儲存,鍊錶在插入 刪除資料元素時比順序儲存要快,但是在查詢乙個節點時則要比順序儲存要慢。使用鏈式儲存可以克服順序線...
線性表的鏈式儲存 單鏈表
邏輯結構上乙個挨著乙個的資料,在實際儲存中,並沒有像順序表那樣也相互緊挨著,恰恰相反,資料隨機分布在記憶體的各個位置,這種儲存結構稱為線性表的鏈式儲存。由於分散儲存,為了能夠體現出資料元素之間的邏輯關係,每個資料元素在儲存的同時,要配備乙個指標,用於指向它的直接後繼元素,即每乙個資料元素都指向下乙個...
線性表的鏈式儲存 單鏈表
forward list creat 3 頭插法 return head 尾插法建表 forward list creat 1 if rear null 對於非空表,將尾結點的下乙個結點置空 rear next null return head 尾插法建表,包含頭結點 forward list cr...