java連結串列初步學習
java中的連結串列和 c/c++ 一樣,也是一種線性資料結構。和陣列的功能有一定的相似,但是兩者之間在某些方面還是存在很大的不同,簡單的來說不同點有以下幾點:
1.在建立陣列時,是一次性地開闢一整塊記憶體空間,所有陣列元素都是放在裡面,必須說明陣列的固定長度。而連結串列可以先建立一個連結串列頭(實際就是第一個結點),在需要的時候動態地新增(擴充套件連結串列)
2.陣列的資料是按照元素順序連續地儲存在記憶體中的,定位陣列中的資料只要知道其在陣列中的位置就行。連結串列是以結點為單位的,在儲存資料時並不是連續存放的,除卻資料外,還另外包含指向下一節點的指標,訪問資料時總是需要從連結串列頭開始
3.對陣列元素進行插入,刪除,修改時需要對陣列元素進行大規模的移動,而連結串列避免了這樣的情況。
連結串列是以結點為單位的,我們需要首先定義宣告連結串列中的結點類
class Node{//先建立一個節點類
private int m_Data;
private Node m_Next;
Node(int data){//只有一個節點
m_Data=data;
m_Next=null;
}
Node(int data,Node next){//包含多個節點,必須定義指標
m_Data=data;
m_Next=next;
}
int getData(){
return m_Data;
}
void setData(int data){
m_Data=data;
}
Node getNext(){
return m_Next;
}
void setNext(Node next){
m_Next=next;
}
}
以下是一些關於建立連結串列,遍歷連結串列,插入,刪除連結串列相關結點的操作:
class Linklist{
Node m_FirstNode;//定義第一個節點
Linklist(){
m_FirstNode=null;
}//第一個建構函式,第一個節點就是為空的,說明是個空連結串列
Linklist(int data){
m_FirstNode=new Node(data);
}//建立一個只有一個節點的連結串列,因為沒有宣告指標
String visitAllNode(){
Node next=m_FirstNode;
String s="";
while (next!=null){
s=s+next.getData();
next=next.getNext();
}
return s;
}//遍歷所有的節點,定義宣告next是為了不影響第一個節點
void insertAfterId(int data,int id){
Node next =m_FirstNode;
if(next==null){
m_FirstNode=new Node(data);
}
else
{
while(next.getNext()!=null&&next.getData()!=id)
next=next.getNext();
next.setNext(new Node(data,next.getNext()));
}
}//在指定的id位置上插入
boolean removeAtId(int id){
Node ahead=m_FirstNode;
Node follow=ahead;
if(ahead==null)
return false;
else if(ahead.getData()==id)
{
m_FirstNode=m_FirstNode.getNext();
return true;
}
else{
ahead=ahead.getNext();
while(ahead!=null){
if(ahead.getData()==id){
follow.setNext(ahead.getNext());
return true;
}
follow=ahead;
ahead=ahead.getNext();
}
return false;
}
}
void removeAll(){
m_FirstNode=null;
}
}