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

線性表的鏈?zhǔn)酱鎯?chǔ)和順序存儲(chǔ)的區(qū)別在于:順序存儲(chǔ)能夠指定索引隨機(jī)的讀取該位置的元素,但在隨機(jī)插入方面不擅長谷市,在表中插入新元素時(shí)需要移動(dòng)大量的已有元素烛占;而鏈?zhǔn)酱鎯?chǔ)則恰好相反,在插入元素方面作谚,他只要通過調(diào)整對(duì)應(yīng)位置的指針即可完成插入而不需要移動(dòng)元素,在隨機(jī)讀取方面卻不擅長庵芭,需要通過表頭指針依次讀取才能找到指定位置的元素妹懒;

單向鏈表的節(jié)點(diǎn)基本結(jié)構(gòu)為一個(gè)存儲(chǔ)數(shù)據(jù)的屬性和一個(gè)指向其后繼的指針,如下圖双吆;


鏈表節(jié)點(diǎn).png

因此創(chuàng)建如下鏈表節(jié)點(diǎn)類眨唬;

/**
 * node list class.
 * @param <T> node element data type
 */
class Node<T> {
    T data;
    Node<T> next;
}

而對(duì)于鏈表本身是將節(jié)點(diǎn)通過指針連接起來,其自身有size屬性表示鏈表中當(dāng)前元素個(gè)數(shù) 和固定的head節(jié)點(diǎn)(head節(jié)點(diǎn)數(shù)據(jù)域?yàn)榭眨┢浜罄^指針指向鏈表第一個(gè)元素好乐;單鏈表最后一個(gè)元素后繼指向null匾竿,而循環(huán)鏈表最后一個(gè)元素的tail指向head;


單鏈表.png

單項(xiàng)循環(huán)鏈表.png

java實(shí)現(xiàn)如下蔚万;

public class NodeList<T extends Comparable> {
    private int size;
    private final Node<T> head;
    //private Node<T> tail;

    public NodeList() {
        size = 0;
        head = new Node<>();
        //tail = head;
    }

    @SafeVarargs
    public NodeList(T... dataPoints) {
        this();
        for (T data : dataPoints) {
            insertAtLast(data);
        }
    }

    public void insertAtLast(T data) {
        Node<T> temp = new Node<>();
        temp.data = data;
        Node<T> tail = head;
        while(tail.next != null) {
            tail = tail.next;
        }
        tail.next = temp;
        //tail = temp;
        size++;
    }

    public Node<T> locate(T data) {
        Node<T> result;
        result = head;
        while (result.next != null) {
            if (result.next.data == data) {
                break;
            }
            result = result.next;
        }
        return result.next;
    }

    public void insert(T data, Node<T> node) {
        if (node.next == null) {
            insertAtLast(data);
            return;
        }
        Node<T> temp = new Node<>();
        temp.data = data;
        temp.next = node.next;
        node.next = temp;
        size++;
    }

    public void insertAt(T data, int index) {
        T dataAtIndex = getData(index);
        Node<T> node = locate(dataAtIndex);
        insert(data, node);
    }

    public void deleteAt(int index) {
        if (index < 1 || index > size) {
            throw new IndexOutOfBoundsException("index should between 1 to " + size);
        }

        int position = 1;
        Node<T> current = head;
        while (current != null && position < index) {
            current = current.next;
            position++;
        }
        if (current != null) {
            current.next = current.next.next;
            size--;
        }
    }

    public T getData(int index) {
        if (index < 1 || index > size) {
            throw new IndexOutOfBoundsException("index should between 1 to " + size);
        }
        T data = null;
        int i = 1;
        Node<T> current = head.next;
        while (current != null) {
            if (i < index) {
                current = current.next;
                i++;
            }
            if (i == index) {
                data = current.data;
                break;
            }
        }
        return data;
    }

    public int getSize() {
        return size;
    }

    public NodeList<T> merge(NodeList<T> lb) {
        NodeList<T> la = this;
        NodeList<T> lc = new NodeList<>();
        Node<T> pa = la.head.next;
        Node<T> pb = lb.head.next;
        Node<T> pc = lc.head;

        while (pa.next != null && pb.next != null) {
            if (pa.data.equals(pb.data)) {
                pc.next = pa;
                pc = pa;
                pa = pa.next;
                pb = pb.next;
            } else if (pa.data.compareTo(pb.data) < 0) {
                pc.next = pa;
                pc = pa;
                pa = pa.next;
            } else {
                pc.next = pb;
                pc = pb;
                pb = pb.next;
            }
        }

        if (pa.next != null) {
            pc.next = pa;
        }

        if (pb.next != null) {
            pc.next = pb;
        }

        Node<T> current = lc.head;
        while (current.next != null) {
            lc.size++;
            current = current.next;
        }
        return lc;
    }
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末岭妖,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌昵慌,老刑警劉巖苔巨,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異废离,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)礁芦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門蜻韭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人柿扣,你說我怎么就攤上這事肖方。” “怎么了未状?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵俯画,是天一觀的道長。 經(jīng)常有香客問我司草,道長艰垂,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任埋虹,我火速辦了婚禮猜憎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘搔课。我一直安慰自己胰柑,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布爬泥。 她就那樣靜靜地躺著柬讨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪袍啡。 梳的紋絲不亂的頭發(fā)上踩官,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音葬馋,去河邊找鬼卖鲤。 笑死,一個(gè)胖子當(dāng)著我的面吹牛畴嘶,可吹牛的內(nèi)容都是我干的蛋逾。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼窗悯,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼区匣!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤亏钩,失蹤者是張志新(化名)和其女友劉穎莲绰,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體姑丑,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蛤签,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了栅哀。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片震肮。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖留拾,靈堂內(nèi)的尸體忽然破棺而出戳晌,到底是詐尸還是另有隱情,我是刑警寧澤痴柔,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布沦偎,位于F島的核電站,受9級(jí)特大地震影響咳蔚,放射性物質(zhì)發(fā)生泄漏豪嚎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一屹篓、第九天 我趴在偏房一處隱蔽的房頂上張望疙渣。 院中可真熱鬧,春花似錦堆巧、人聲如沸妄荔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽啦租。三九已至,卻和暖如春荒揣,著一層夾襖步出監(jiān)牢的瞬間篷角,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國打工系任, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留恳蹲,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓俩滥,卻偏偏與公主長得像嘉蕾,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子霜旧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

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