鏈表之單向鏈表

鏈表的機(jī)制靈活,用途廣泛,它適用于許多通用的數(shù)據(jù)庫(kù)。它也可以取代數(shù)據(jù),作為其他存儲(chǔ)結(jié)構(gòu)的基礎(chǔ),例如棧和隊(duì)列,除非需要頻繁通過(guò)下標(biāo)隨機(jī)訪問(wèn)各個(gè)數(shù)據(jù),否則在很多適用數(shù)組的地方都可以用鏈表代替。

鏈接點(diǎn)(Link)

在鏈表中,每個(gè)數(shù)據(jù)項(xiàng)都被包含在鏈接點(diǎn)中。一個(gè)鏈接點(diǎn)是某個(gè)類的對(duì)象,這個(gè)類可以叫做Link。因?yàn)橐粋€(gè)鏈表中有許多類似的鏈接點(diǎn),所以有必要用一個(gè)不同于鏈表的類來(lái)表達(dá)鏈接點(diǎn)。每個(gè)Link對(duì)象中毒包含一個(gè)對(duì)下一個(gè)鏈接點(diǎn)引用的字段,通常叫做next,但是鏈表本身對(duì)象中有一個(gè)字段指向?qū)Φ谝粋€(gè)鏈接點(diǎn)的引用

單鏈表的實(shí)現(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的變量開(kāi)始時(shí)指向first,然后通過(guò)不斷地把自己復(fù)制給current.next,沿著鏈表向前移動(dòng),在每個(gè)鏈接點(diǎn)處,find()檢查鏈表節(jié)點(diǎn)的關(guān)鍵之是否和它尋找的相等,如果找到了,它返回對(duì)該鏈接點(diǎn)的引用。如果find()到達(dá)鏈表的尾端,但沒(méi)有發(fā)現(xiàn)要找的鏈接點(diǎn),則返回null

delete()方法

delete()方法和find()方法類似,它先搜索要?jiǎng)h除的鏈接點(diǎn)。然而它需要掌握的不僅是指向當(dāng)前鏈接點(diǎn)的引用,還有指向當(dāng)前鏈接點(diǎn)的前一個(gè)(previous)鏈接點(diǎn)的引用,這是因?yàn)?,如果要?jiǎng)h除當(dāng)前的鏈接點(diǎn)必須把前一個(gè)鏈接點(diǎn)和后一個(gè)鏈接點(diǎn)連在一起,知道前一個(gè)鏈接點(diǎn)位置的唯一方法是擁有一個(gè)對(duì)它的引用

在while語(yǔ)句的每一次循環(huán)中,每當(dāng)current變量賦值為current.next之前,先把previous變量賦值為current,這保證了它總數(shù)指向current所指鏈接點(diǎn)的前一個(gè)鏈接點(diǎn),一旦發(fā)現(xiàn)當(dāng)前鏈接帶你是要被刪除的鏈接點(diǎn),就把前一個(gè)鏈接點(diǎn)的next字段賦值為當(dāng)前鏈接點(diǎn)的下一個(gè)鏈接點(diǎn)。如果當(dāng)前鏈接點(diǎn)是第一個(gè)鏈接點(diǎn),這是一種特殊情況,因?yàn)檫@是由LinkList對(duì)象的first指向的鏈接點(diǎn),而不是別的鏈接點(diǎn)的next字段所指的,在這種情況下,使first字段指向first.next,就可以刪除第一個(gè)鏈接點(diǎn)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 在上一節(jié),我們知道了動(dòng)態(tài)數(shù)組實(shí)現(xiàn)的大概原理,不過(guò),動(dòng)態(tài)數(shù)組卻有一個(gè)明顯的缺點(diǎn),即可能會(huì)造成內(nèi)存空間的大量浪費(fèi)。因?yàn)?..
    ducktobey閱讀 130評(píng)論 0 0
  • 鏈表之單向鏈表 1、結(jié)點(diǎn) 結(jié)點(diǎn)是鏈表中一個(gè)重要且基本的組成部分,結(jié)點(diǎn)的形式是,第一個(gè)存儲(chǔ)區(qū)存儲(chǔ)結(jié)點(diǎn)元素?cái)?shù)據(jù),第二個(gè)...
    Wencyyyyyy閱讀 283評(píng)論 0 1
  • 為什么需要鏈表 順序表的構(gòu)建需要預(yù)先知道數(shù)據(jù)大小來(lái)申請(qǐng)連續(xù)的存儲(chǔ)空間,而在進(jìn)行擴(kuò)充時(shí)又需要進(jìn)行數(shù)據(jù)的搬遷,所以使用...
    墨痕hz閱讀 829評(píng)論 0 1
  • 反轉(zhuǎn)一個(gè)單鏈表。輸入: 1->2->3->4->5->NULL輸出: 5->4->3->2->1->NULL 圖解...
    ElricTang閱讀 128評(píng)論 0 0
  • 今天青石的票圈出鏡率最高的,莫過(guò)于張藝謀的新片終于定檔了。 一張滿溢著水墨風(fēng)的海報(bào)一次次的出現(xiàn)在票圈里,也就是老謀...
    青石電影閱讀 10,804評(píng)論 1 2

友情鏈接更多精彩內(nèi)容