在資料結構中,鍊錶是基本乙個的資料結構,所以我們要能夠實現乙個簡單的單鏈表以及對鍊錶的基本操作要十分熟悉,才能在筆試或者面試的時候更有把握!
如上圖所示的是乙個單鏈表的儲存原理圖,head為頭節點。而每個節點中都有乙個next引用,指向下乙個節點,就這樣一節一節往下面記錄,直到最後乙個節點,最後乙個節點的next指向null 。而我們學習資料結構的鍊錶時,使用的是如下圖所示的虛擬頭結點(head),即不存放任何的資料,只是充當乙個指向鍊錶中真正存放資料的第乙個節點的作用。
實現單鏈表的思路:
1)鍊錶類,結點類(鍊錶類的內部類),建立一條鍊錶類物件,通過方法逐步建立結點類,通過引用鏈結起來成為鍊錶。
2)結點類包含資料和對下個結點的引用,以及可以對資料賦值的建構函式。
3)鍊錶類的構造方法,只構造出不含資料的頭結點。
節點類
鍊錶是由乙個個節點連線形成的,所以要先定義好節點類,節點類主要分為兩塊內容就是資料和next指標,定義可以參看下面**:
/**
* * 單向鍊錶的節點類
*/private class node
public node(e data, node next)
@override
public string tostring()
}
接下來,我們就可以對鍊錶的各種操作進行定義了:
給鍊錶新增節點
注意:對於插入節點常用的思想主要有頭插法 和 尾插法,在這裡我們的**都將它們實現了。
public void add(int index, e e)
node n = new node(e, null);
if (index == 0)
} else if (index == size) else
n.next = p.next;
p.next = n;
} size++;
} public e getfirst()
public e getlast()
增加節點到鍊錶指定的位置對於傳入的index需要先判斷是否合法,然後通過for迴圈的遍歷尋找index的位置來進行節點的插入。
public void set(int index, e e)
if (index == 0) else if (index == size - 1) else
p.data = e;
} }
返回鍊錶的長度與判空
//獲取鍊錶的長度
public int getsize()
//判空
public boolean isempty()
刪除鍊錶的節點
//正常刪除
public e remove(int index)
e res=null;
if(index==0)
}else if(index==size-1)
p.next=null;
rear=p;
}else
遍歷鍊錶(即重寫tostring()方法對鍊錶進行遍歷)
@override
public string tostring() elseelse}}
return sb.tostring();
}
測試:
//測試程式
public class main
system.out.println(list);
system.out.println(list.peek());
for(int i=1;i<=5;i++)
system.out.println(list);
}}
測試結果:
基本的單鏈表操作就是上面這些了,我們實現單鏈表首先是為了理解鍊錶的原理,同時也是為了後續對鏈式棧、鏈式佇列、迴圈鍊錶等資料結構的實現奠定基礎。
資料結構 鍊錶之單鏈表
單鏈錶即每個節點都存在資料域和指標域 特殊節點除外 每個節點都乙個直接前驅節點和直接後繼節點 頭節點無前驅,尾節點無後繼 簡單來說就是上乙個節點的指標域中存放了下乙個節點的位址,因此可以實現層層節點依次查詢,時間複雜度為o n 這也就是相對順序表而言的缺點,但是對於頻繁的插入和刪除節點卻是相對於順序...
資料結構03 鍊錶之單鏈表
鍊錶帶頭結點和不帶頭結點的區別?完成單鏈表的以下基本操作 完整 鍊錶的結構非常多樣,以下情況組合起來就有8種鍊錶結構 單向 雙向 帶頭 不帶頭 迴圈 非迴圈 鍊錶的節點 typedef struct slistnode node,pnode 鍊錶的結構,給乙個頭指標儲存鍊錶第乙個節點的位址 type...
資料結構 鍊錶1(單鏈表)
資料結構 單鏈表 單鏈表的定義 單鏈表是用一組任意的儲存單元存放線性表的元素,這組儲存單元可以連續也可以不連續,甚至可以零散分布在記憶體中的任意位置。每個儲存單元在儲存資料元素的同時,還必須儲存其後記元素的位址資訊,這個位址資訊稱為指標。這兩部分組成了資料元素的儲存映像,稱為結點。結點node分為資...