簡單實(shí)現(xiàn)一下單鏈表

鏈表結(jié)構(gòu)

鏈?zhǔn)酱鎯Y(jié)構(gòu)是基于指針實(shí)現(xiàn)的。我們把一個數(shù)據(jù)元素和一個指針稱為結(jié)點(diǎn)。鏈?zhǔn)酱鎯Y(jié)構(gòu)是用指針把相互直接關(guān)聯(lián)的結(jié)點(diǎn)(即直接前驅(qū)結(jié)點(diǎn)或直接后繼結(jié)點(diǎn))鏈接起來币励。鏈?zhǔn)酱鎯Y(jié)構(gòu)的線性表稱為鏈表

鏈表類型

根據(jù)鏈表的構(gòu)造方式的不同可以分為:

  1. 單向鏈表
  2. 單向循環(huán)鏈表
  3. 雙向循環(huán)鏈表

單鏈表

單鏈表是構(gòu)成鏈表的每個結(jié)點(diǎn)只有一個指向直接后繼結(jié)點(diǎn)的指針阳仔。單鏈表的表示方法,單鏈表中每個結(jié)點(diǎn)的結(jié)構(gòu):


image.png

單鏈表結(jié)構(gòu)

單鏈表有帶頭結(jié)點(diǎn)結(jié)構(gòu)和不帶頭結(jié)點(diǎn)結(jié)構(gòu)兩種导俘。我們把指向單鏈表的指針稱為單鏈表的頭指針甘磨。頭指針?biāo)傅牟淮娣艛?shù)據(jù)元素的第一個結(jié)點(diǎn)稱作頭結(jié)點(diǎn)强法。存放第一個數(shù)據(jù)元素的結(jié)點(diǎn)稱作第一個數(shù)據(jù)元素結(jié)點(diǎn),或稱首元結(jié)點(diǎn)

image.png

節(jié)點(diǎn)類

單鏈表是由一個一個結(jié)點(diǎn)組成的荆陆,因此,要設(shè)計單鏈表類饼问,必須先設(shè)計結(jié)點(diǎn)類稚照。結(jié)點(diǎn)類的成員變量有兩個:一個是數(shù)據(jù)元素,另一個是表示下一個結(jié)點(diǎn)的對象引用(即指針)凯沪。設(shè)計操作

  1. 頭結(jié)點(diǎn)的初始化
  2. 非頭結(jié)點(diǎn)的構(gòu)造
  3. 獲取該結(jié)點(diǎn)指向的下個結(jié)點(diǎn)
  4. 設(shè)置該結(jié)點(diǎn)指向的下個結(jié)點(diǎn)
  5. 設(shè)置該結(jié)點(diǎn)的數(shù)據(jù)
  6. 獲取該結(jié)點(diǎn)的數(shù)據(jù)

順序表和單鏈表的比較

順序表的主要優(yōu)點(diǎn)是支持隨機(jī)讀取第焰,以及內(nèi)存空間利用效率高;順序表的主要缺點(diǎn)是需要預(yù)先給出數(shù)組的最大數(shù)據(jù)元素個數(shù)妨马,而這通常很難準(zhǔn)確作到挺举。當(dāng)實(shí)際的數(shù)據(jù)元素個數(shù)超過了預(yù)先給出的個數(shù),會發(fā)生異常烘跺。另外湘纵,順序表插入和刪除操作時需要移動較多的數(shù)據(jù)元素。

和順序表相比滤淳,單鏈表的主要優(yōu)點(diǎn)是不需要預(yù)先給出數(shù)據(jù)元素的最大個數(shù)梧喷。另外,單鏈表插入和刪除操作時不需要移動數(shù)據(jù)元素。 單鏈表的主要缺點(diǎn)是每個結(jié)點(diǎn)中要有一個指針铺敌,因此單鏈表的空間利用率略低于順序表的汇歹。另外,單鏈表不支持隨機(jī)讀取偿凭,單鏈表取數(shù)據(jù)元素操作的時間復(fù)雜度為O(n)产弹;而順序表支持隨機(jī)讀取,順序表取數(shù)據(jù)元素操作的時間復(fù)雜度為O(1)笔喉。

單鏈表的效率分析

在單鏈表的任何位置上插入數(shù)據(jù)元素的概率相等時取视,在單鏈表中插入一個數(shù)據(jù)元素時比較數(shù)據(jù)元素的平均次數(shù)為:


image.png

刪除單鏈表的一個數(shù)據(jù)元素時比較數(shù)據(jù)元素的平均次數(shù)為:


image.png

因此,單鏈表插入和刪除操作的時間復(fù)雜度均為O(n)常挚。另外作谭,單鏈表取數(shù)據(jù)元素操作的時間復(fù)雜度也為O(n)。

單鏈表實(shí)現(xiàn)

單鏈表節(jié)點(diǎn)數(shù)據(jù)結(jié)構(gòu)

package com.algorithm.list;
public class ListedNode {
    Object element;
    ListedNode next;
    public ListedNode(ListedNode next){
        this.next = next;
    }
    public ListedNode(Object element, ListedNode next){
        this.element = element;
        this.next = next;
    }
    public void setElement(Object element) {
        this.element = element;
    }
    public Object getElement() {
        return element;
    }
    public ListedNode getNext() {
        return next;
    }
    public void setNext(ListedNode next) {
        this.next = next;
    }
    @Override
    public String toString() {
        return this.element.toString();
    }
}

單鏈表實(shí)現(xiàn)

package com.algorithm.list;
import java.time.temporal.Temporal;
public class LinkList implements List {
    /**
     * 頭指針
     */
    private ListedNode head;
    /**
     * 當(dāng)前節(jié)點(diǎn)對象
     */
    private ListedNode current;
    /**
     * 節(jié)點(diǎn)個數(shù)
     */
    private int size;
    /**
     * 創(chuàng)建空的鏈表
     */
    public LinkList() {
        // 初始化頭節(jié)點(diǎn)奄毡,頭指針指向頭節(jié)點(diǎn)折欠,當(dāng)前節(jié)點(diǎn)對象等于頭節(jié)點(diǎn)
        this.head = current = new ListedNode(null);
        // 單項鏈表初始長度
        this.size = 0;
    }
    @Override
    public int size() {
        return this.size;
    }

    /**
     * 獲取當(dāng)前對象的前一個節(jié)點(diǎn),將當(dāng)前節(jié)點(diǎn)定位到要操作節(jié)點(diǎn)的前一個元素吼过,思考
     * @param index
     * @throws Exception
     */
    private void index(int index) throws Exception {
        // 小于-1锐秦,以首元節(jié)點(diǎn)索引為0,頭節(jié)點(diǎn)為-1
        if(index < -1 || index > size - 1){
            throw new Exception("參數(shù)錯誤");
        }
        // 在頭節(jié)點(diǎn)之后操作
        if(index == -1){
            return;
        }
        int j = 0;
        current = head.next;
        while(current != null && j < index){
            current = current.next;
            j++;
        }
    }
    @Override
   public void insert(int index, Object obj) throws Exception {
        // TODO Auto-generated method stub
        if(index <0 ||index >size)
        {
            throw new Exception("參數(shù)錯誤盗忱!");
        }
        //定位到要操作結(jié)點(diǎn)的前一個結(jié)點(diǎn)對象酱床。
        index(index-1);
        current.setNext(new ListedNode(obj,current.next));
        size++;
    }
    @Override
    public void delete(int index) throws Exception {
        if(isEmpty()){
            throw new Exception("鏈表為空,無法刪除!!");
        }
        check(index, 0, "參數(shù)范圍錯誤");
        index(index - 1);
        current.setNext(current.next.next);
        this.size --;
    }
    private void check(int index, int i, String message) throws Exception {
        if (index < i || index > size) {
            throw new Exception(message);
        }
    }
    @Override
    public Object get(int index) throws Exception {
        check(index, 0, "參數(shù)范圍錯誤");
        index(index);
        return current.getElement();
    }
    @Override
    public boolean isEmpty() {
        return this.size == 0;
    }
    public static void main(String[] args) throws Exception {
        LinkList list = new LinkList();
        for(int i = 0; i < 10; i++){
            int t = (int) ((Math.random()*100) % 100);
            list.insert(i,t);
            System.out.print(t+" ");
        }
        // 刪除第五個元素
        list.delete(4);
        System.out.println("刪除之后");
        for(int i = 0; i < list.size;i++){
            System.out.print(list.get(i) + " ");
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末趟佃,一起剝皮案震驚了整個濱河市扇谣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌闲昭,老刑警劉巖罐寨,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異序矩,居然都是意外死亡鸯绿,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進(jìn)店門簸淀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瓶蝴,“玉大人,你說我怎么就攤上這事租幕∠鲜郑” “怎么了?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵令蛉,是天一觀的道長。 經(jīng)常有香客問我,道長珠叔,這世上最難降的妖魔是什么蝎宇? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮祷安,結(jié)果婚禮上姥芥,老公的妹妹穿的比我還像新娘。我一直安慰自己汇鞭,他們只是感情好凉唐,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著霍骄,像睡著了一般台囱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上读整,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天簿训,我揣著相機(jī)與錄音,去河邊找鬼米间。 笑死强品,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的屈糊。 我是一名探鬼主播的榛,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼逻锐!你這毒婦竟也來了夫晌?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤谦去,失蹤者是張志新(化名)和其女友劉穎慷丽,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鳄哭,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡要糊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了妆丘。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锄俄。...
    茶點(diǎn)故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖勺拣,靈堂內(nèi)的尸體忽然破棺而出奶赠,到底是詐尸還是另有隱情,我是刑警寧澤药有,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布毅戈,位于F島的核電站苹丸,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏苇经。R本人自食惡果不足惜赘理,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望扇单。 院中可真熱鬧商模,春花似錦、人聲如沸蜘澜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鄙信。三九已至瞪醋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間扮碧,已是汗流浹背趟章。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留慎王,地道東北人蚓土。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像赖淤,于是被迫代替她去往敵國和親蜀漆。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評論 2 355