鏈表之單向鏈表

鏈表的機(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裹虫,就可以刪除第一個鏈接點

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市融击,隨后出現(xiàn)的幾起案子筑公,更是在濱河造成了極大的恐慌,老刑警劉巖尊浪,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件匣屡,死亡現(xiàn)場離奇詭異封救,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)捣作,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進(jìn)店門誉结,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人券躁,你說我怎么就攤上這事惩坑。” “怎么了也拜?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵以舒,是天一觀的道長。 經(jīng)常有香客問我搪泳,道長稀轨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任岸军,我火速辦了婚禮奋刽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘艰赞。我一直安慰自己佣谐,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布方妖。 她就那樣靜靜地躺著狭魂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪党觅。 梳的紋絲不亂的頭發(fā)上雌澄,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天,我揣著相機(jī)與錄音杯瞻,去河邊找鬼镐牺。 笑死,一個胖子當(dāng)著我的面吹牛魁莉,可吹牛的內(nèi)容都是我干的睬涧。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼旗唁,長吁一口氣:“原來是場噩夢啊……” “哼畦浓!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起检疫,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤讶请,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后屎媳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體秽梅,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡抹蚀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年剿牺,在試婚紗的時候發(fā)現(xiàn)自己被綠了企垦。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡晒来,死狀恐怖钞诡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情湃崩,我是刑警寧澤荧降,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站攒读,受9級特大地震影響朵诫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜薄扁,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一剪返、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧邓梅,春花似錦脱盲、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至匣距,卻和暖如春面哥,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背毅待。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工尚卫, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人恩静。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓焕毫,卻偏偏與公主長得像,于是被迫代替她去往敵國和親驶乾。 傳聞我的和親對象是個殘疾皇子邑飒,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內(nèi)容