list是最簡單的資料結構,可分為順序表與鍊錶,順序表內部資料儲存由陣列實現,鍊錶則是由乙個個自定義的節點node進行串聯,就像鎖鏈一樣
因為內部是由陣列實現(陣列初始化時長度即固定),所有順序表在增加元素時有動態擴容的需求,且元素發生變換時(實體地址連續),容易頻繁引起陣列的批量複製修改;
鍊錶內部是由自定義的節點進行連線的,所以能查詢上一節點與下一節點的稱為雙鏈表,只能查詢下一節點的稱為單鏈表。單鏈表由於只能從頭往尾查詢,在節點查詢上效率比雙鏈表低一半(雙鏈表可以通過位置與長度比較判斷離頭尾哪個更近)
增:觸發指定位置的node 及前node的斷裂與再連線
刪:觸發指定位置的node 與前後node的斷裂與再連線前節點prenode,指定位置節點node,新增節點newnode;public
void
add(
int index, e element)
newnode.prev = prenode;
newnode.next = node;
prenode.next = newnode;
node.prev = newnode;
在實際中要注意引用的變化,pernode一般是用node.prev來代替,如果node引用改變容易引起錯誤指向。同時注意前後節點不存在的情況(即頭尾節點操作)
list前節點prenode,指定位置節點node,後節點nextnode;public e remove
(int index)
e unlink
(node
x)else
if(next == null)
else
x.item = null;
size--
; modcount++
;return element;
}
prenode.next = nextnode;
nextnode.prev = prenode;
node.next = null;
node.prev = null;
node.item = null;
同樣注意:在實際中要注意引用的變化,pernode,nextnode一般是間接引用,如果node引用改變容易引起錯誤指向。同時注意前後節點不存在的情況(即頭尾節點操作)
優點缺點
應用順序表
儲存空間連續、允許隨機訪問、尾插,尾刪方便
插入效率低 刪除效率低 長度固定
普遍在用(android中基本儲存查詢操作較多,不涉及太多中間增刪)
單鏈表隨意進行增刪改、插入效率高、刪除效率高、長度可以隨意修改
記憶體不連續、不能隨機查詢、查詢效率低
messagequeue、hashmap
雙鏈表隨意進行增刪改、插入效率高、刪除效率高、長度可以隨意修改
記憶體不連續、不能隨機查詢、查詢效率比單鏈表快一倍
linkedlist
反轉單鏈表
合併兩個有序鍊錶
兩數相加
兩兩交換
資料結構(線性表)
1.試寫一演算法,在無頭結點的動態單鏈表上實現線性表操作insert l,i,b 並和在帶頭結點的動態單鏈表上實現相同操作的演算法進行比較。status insert linklist l,int i,int b 在無頭結點鍊錶l的第 i個元素之前插入元素 belse insert 2.已知線性表中...
資料結構 線性表
參考 一 線性表 順序表 單鏈表 迴圈鍊錶 雙鏈表 順序表 1.表的初始化 void initlist seqlist l 2.求表長 int listlength seqlist l 3.取表中第i個結點 datatype getnode l,i 4.查詢值為x的結點 5.插入 具體演算法描述 v...
資料結構 線性表
線性表是最基礎的一種資料結構,這樣的資料物件包含的資料元素具有一對一的前驅後繼關係。按其邏輯儲存方式的不同可分為兩類線性表 順序表和鏈式表。其中鏈式表又可分為線性鍊錶 迴圈鍊錶和雙向鍊錶。下面分別介紹下這幾種線性表的資料結構 1.順序表 typedef struct sqlist 插入演算法 i到n...