什麼是鍊錶
特點:資料元素的儲存對應的是不連續的儲存空間,每個儲存結點對應乙個需要儲存的資料元素。每個結點是由資料域和指標域組成。 元素之間的邏輯關係通過儲存節點之間的鏈結關係反映出來。
邏輯上相鄰的節點物理上不必相鄰。
缺點:1、比順序儲存結構的儲存密度小 (每個節點都由資料域和指標域組成,所以相同空間內假設全存滿的話順序比鏈式儲存更多)。
2、查詢結點時鏈式儲存要比順序儲存慢(每個節點位址不連續、無規律,導致按照索引查詢效率低下)。
優點:1、插入、刪除靈活 (不必移動節點,只要改變節點中的指標,但是需要先定位到元素上)。
2、有元素才會分配結點空間,不會有閒置的結點。
單向鍊錶
單向鍊錶的節點只有乙個資料域和乙個指標域,資料域用來儲存該節點需要儲存的資料,指標域指向該節點的下乙個節點
**實現
//單向鍊錶類
public
class
singlelinkedlist
public
node
(t val)
@override
public string tostring()
';}@override
public
boolean
equals
(object o)
}//建立頭結點 不存放任何資料
node head =
newnode()
;//增
//尾插法
public
void
addlast
(t val)
//新增到尾節點後
temp.next =
newnode
(val);}
//頭插法
public
void
addhead
(t val)
//刪除指定下標元素
public
boolean
delete
(int index)
//下標從0開始,將輔助節點temp移動到指定下標處的前乙個元素
node temp = head;
for(
int i =
0; i < index; i++
)//將temp的next域指向要刪除的節點的下乙個節點
temp.next = temp.next.next;
return
true;}
//獲取鍊錶中有效節點個數
public
intgetlength()
node temp = head.next;
int count =1;
while
((temp = temp.next)
!= null)
return count;
}//改
public t alter
(int index,t val)
//將temp移動到指定下標處,下標從0開始
node temp = head.next;
t oldval;
for(
int i =
0; i < index; i++
)//修改當前節點的資料域儲存的資料,並將原來的資料返回
oldval = temp.val;
temp.val = val;
return oldval;
}//查
public
intselect
(t val)
index++;}
return-1
;}//顯示鍊錶中的元素
public
void
show()
}}
缺點
單向鍊錶只能通過乙個方向來遍歷鍊錶,無法反向遍歷
刪除節點時需要依靠被刪除的節點的前乙個節點
雙向鍊錶
雙向鍊錶的節點由乙個資料域和兩個指標域組成,乙個指標域指向該節點的前乙個節點(pre),另乙個指標域指向該節點的下乙個節點(next)
**實現
//雙向鍊錶類
public
class
twinlinkedlist
public
node
(t val)
@override
public string tostring()
';}}
//頭結點
private node head;
//尾節點
private node tail;
//鍊錶中節點個數
private
int size =0;
public
twinlinkedlist()
//增public
void
add(t val)
//尾節點初始化
if(tail == null)
//將要新增的節點新增到尾節點的下乙個
tail.next =
newnode
(val)
;//要新增的節點的pre指向尾節點
tail.next.pre = tail;
//尾節點變成新新增的節點
tail = tail.next;
size++;}
//刪public
boolean
delete
(int index)
node temp = head;
for(
int i =
0; i < index; i++
) size--
;//將temp的前乙個節點的next指向temp的後乙個節點
temp.pre.next = temp.next;
if(temp.next == null)
//temp的後乙個節點的pre指向temp的前乙個節點
temp.next.pre = temp.pre;
return
true;}
//改public t alter
(int index,t val)
node temp = head;
t oldval = null;
for(
int i =
0; i < index; i++
) oldval = temp.val;
temp.val = val;
return oldval;
}//查
public
intselect
(t val)
node temp = head;
int index =0;
while
(temp != null)
index++
; temp = temp.next;
}return-1
;}//列印鍊錶中的節點
public
void
print()
}public
intgetsize()
}
環形鍊錶
頭結點和尾節點連線在一起的鍊錶,在單鏈表和雙鏈表中都可以實現
**實現
public
class
annularlinedlist
@override
public string tostring()
';}}
private node first;
//頭結點
private node temp;
//下乙個節點的新增位置
public
void
add(t val)
temp.next =
newnode
(val)
; temp.next.next = first;
temp = temp.next;
}}
資料結構學習筆記 鍊錶
表示式的計算 表示式的計算涉及到棧的操作 對於表示式 a b c d e f 演算法 用到兩個棧,分別是符號棧和運算元棧。輸入表示式時,為了表示表示式輸入完畢,在表示式的最後加上 號,也就是說輸入的表示式為 a b c d e f 首先設定各個符號的優先順序,和 的優先順序為0,也就是最低的 和 的...
資料結構學習筆記 鍊錶
2.建立鍊錶 3.單向和雙向迴圈鍊錶 4.總結 struct list node 首先了解鍊錶的組成部分 說明 頭節點 在單鏈表的第乙個結點之前附設乙個結點,它沒有直接前驅,稱之為頭結點,頭結點的資料域可以不儲存任何資訊,指標域指向第乙個節點 首節點 的位址。頭結點的作用是使所有鍊錶 包括空表 的頭...
資料結構學習 鍊錶
將從下面4部分進行介紹 首先介紹鍊錶是什麼,然後介紹為什麼定義鍊錶,接著是鍊錶的分類,最後簡單介紹一下鍊錶結點的插入與刪除方法。首先,在介紹鍊錶之前,我們先介紹一下什麼是順序儲存結構。我們知道資料在計算機中的儲存就像貨物在倉庫中的儲存一樣,不但占用一定的空間,還要有乙個標示儲存位置的位址。計算機通過...