鏈表的機(jī)制靈活,用途廣泛麻敌,它適用于許多通用的數(shù)據(jù)庫。它也可以取代數(shù)據(jù),作為其他存儲結(jié)構(gòu)的基礎(chǔ)荐操,例如棧和隊列,除非需要頻繁通過下標(biāo)隨機(jī)訪問各個數(shù)據(jù)眨业,否則在很多適用數(shù)組的地方都可以用鏈表代替推盛。
鏈接點(Link)
在鏈表中葱淳,每個數(shù)據(jù)項都被包含在鏈接點中。一個鏈接點是某個類的對象抛姑,這個類可以叫做Link赞厕。因為一個鏈表中有許多類似的鏈接點,所以有必要用一個不同于鏈表的類來表達(dá)鏈接點定硝。每個Link對象中毒包含一個對下一個鏈接點引用的字段皿桑,通常叫做next,但是鏈表本身對象中有一個字段指向?qū)Φ谝粋€鏈接點的引用
單鏈表的實現(xiàn)
public class Link {
public int iData;
public double dData;
public Link next;
public Link(int id,double dd){
iData=id;
dData=dd;
}
public void displayLink(){
System.out.println("{"+iData+","+dData+"}");
}
}
class LinkList{
private Link first;
public LinkList(){
first=null;
}
public boolean isEmpty(){
return (first==null);
}
public void insertFirst(int id ,double dd){
Link newLink=new Link(id,dd);
newLink.next=first;
first=newLink;
}
public Link deleteFirst(){
Link tmp=first;
first=first.next;
return tmp;
}
public void displayList(){
Link current=first;
while(current!=null){
current.displayLink();
current=current.next;
}
}
public Link find(int key){
Link current=first;
while (current.iData!=key){
if(current.next==null){
return null;
}else{
current=current.next;
}
}
return current;
}
public Link delete(int key){
Link current=first;
Link previous=first;
while (current.iData!=key){
if(current.next==null){
return null;
}else{
previous=current;
current=current.next;
}
}
if(current==first){
first=first.next;
}else{
previous.next=current.next;
}
return current;
}
public static void main(String[] args) {
LinkList linkList=new LinkList();
linkList.insertFirst(22,2.2);
linkList.insertFirst(44,4.3);
linkList.displayList();
//
// while(!linkList.isEmpty()){
// Link link=linkList.deleteFirst();
// System.out.println("deleted");
// link.displayLink();
// }
// linkList.displayList();
Link link = linkList.find(44);
if(link!=null){
System.out.println("find it"+link.iData);
}else{
System.out.println("not find link");
}
Link d=linkList.delete(44);
if(d!=null){
System.out.println("delete"+d.iData);
}else{
System.out.println("not delete");
}
linkList.displayList();
}
}
find()方法
find()方法中被稱為current的變量開始時指向first,然后通過不斷地把自己復(fù)制給current.next蔬啡,沿著鏈表向前移動诲侮,在每個鏈接點處,find()檢查鏈表節(jié)點的關(guān)鍵之是否和它尋找的相等箱蟆,如果找到了沟绪,它返回對該鏈接點的引用。如果find()到達(dá)鏈表的尾端空猜,但沒有發(fā)現(xiàn)要找的鏈接點绽慈,則返回null
delete()方法
delete()方法和find()方法類似,它先搜索要刪除的鏈接點辈毯。然而它需要掌握的不僅是指向當(dāng)前鏈接點的引用坝疼,還有指向當(dāng)前鏈接點的前一個(previous)鏈接點的引用,這是因為谆沃,如果要刪除當(dāng)前的鏈接點必須把前一個鏈接點和后一個鏈接點連在一起钝凶,知道前一個鏈接點位置的唯一方法是擁有一個對它的引用
在while語句的每一次循環(huán)中,每當(dāng)current變量賦值為current.next之前管毙,先把previous變量賦值為current腿椎,這保證了它總數(shù)指向current所指鏈接點的前一個鏈接點,一旦發(fā)現(xiàn)當(dāng)前鏈接帶你是要被刪除的鏈接點夭咬,就把前一個鏈接點的next字段賦值為當(dāng)前鏈接點的下一個鏈接點啃炸。如果當(dāng)前鏈接點是第一個鏈接點,這是一種特殊情況卓舵,因為這是由LinkList對象的first指向的鏈接點南用,而不是別的鏈接點的next字段所指的,在這種情況下掏湾,使first字段指向first.next裹虫,就可以刪除第一個鏈接點