<<漫畫算法>>--數(shù)據(jù)結(jié)構(gòu)之鏈表

大部分記錄均來自小灰漫畫算法

  • 什么是鏈表?
    物理上非連續(xù)、非順序的數(shù)據(jù)結(jié)構(gòu)萤彩。由若干節(jié)點(diǎn)組成。


    鏈表.png
  • 鏈表的基本操作
    ①查找節(jié)點(diǎn):只能從頭節(jié)點(diǎn)開始向后一個(gè)節(jié)點(diǎn)逐一查找斧拍。
    第一步:將查找的指針定位到頭節(jié)點(diǎn)雀扶;
    第二步:根據(jù)頭節(jié)點(diǎn)的next指針,定位到第二個(gè)節(jié)點(diǎn)肆汹;
    第三布:根據(jù)第二個(gè)節(jié)點(diǎn)的next指針愚墓,定位到第三個(gè)節(jié)點(diǎn)。依次類推昂勉。
    ②更新節(jié)點(diǎn):不考慮查找的情況下浪册,直接舊數(shù)據(jù)替換成新數(shù)據(jù)即可。
    ③插入節(jié)點(diǎn):
  • 頭部插入
    第一步:新節(jié)點(diǎn)的Next指針指向原先的頭節(jié)點(diǎn)
    第二步:新節(jié)點(diǎn)變?yōu)殒湵淼念^節(jié)點(diǎn)
  • 尾部插入
    最后一個(gè)節(jié)點(diǎn)的next指向新插入節(jié)點(diǎn)即可
  • 中間插入
    第一步:新節(jié)點(diǎn)的Next指針岗照,指向插入位置的節(jié)點(diǎn)村象;
    第二部:插入位置的前置節(jié)點(diǎn)next指針笆环,指向新節(jié)點(diǎn)。
    ④刪除節(jié)點(diǎn):
  • 頭部刪除
    鏈表頭節(jié)點(diǎn)設(shè)置為原先頭節(jié)點(diǎn)的next指針
  • 尾部刪除
    指向最后一個(gè)元素的Next指針厚者,置為Null即可
  • 中間刪除
    刪除節(jié)點(diǎn)的前置節(jié)點(diǎn)的Next指針躁劣,指向要?jiǎng)h除元素的下一個(gè)節(jié)點(diǎn)即可。
    //記錄鏈表的長度
    private int size = 0;
    //頭尾指針
    private Node head;
    private Node last;

    /**
     * 插入元素
     * @param data:插入元素
     * @param index:插入位置(從0開始)
     */
    public void insert(int data,int index){
        //TODO:判斷插入位置
        if(index < 0 && index > size) {
            throw new IndexOutOfBoundsException("超出鏈表范圍");
        }
        //TODO:創(chuàng)建要插入的元素
        Node node = new Node(data);
        //TODO:插入位置判斷(頭部库菲,尾部账忘,中間)
        if(size == 0) {//創(chuàng)建一個(gè)鏈表
            head = last = node;
        }else if(index == 0) {
            node.next = head;
            head = node;
        }else if(index == size) {
            last.next = node;
            last  = node;
        }else{
            Node preNode = findNode(index - 1);
            node.next = preNode.next;
            preNode.next = node;
        }
        //TODO:插入后鏈表長度加1
        size++;
    }

    /**
     * 根據(jù)位置查找對(duì)應(yīng)的節(jié)點(diǎn)
     * @param index:查找的位置
     * @return:查詢結(jié)果
     */
    public Node findNode(int index){
        //TODO:判斷查詢位置是否合法
        if(index < 0 && index > size) {
            throw new IndexOutOfBoundsException("超出鏈表查詢范圍");
        }
        //TODO:頭節(jié)點(diǎn)開始逐一向后一節(jié)點(diǎn)查找
        if(size == 0) {
            throw new IndexOutOfBoundsException("暫無鏈表");
        }else{
            Node node = head;
            for (int pos = 0 ; pos < index ; pos++){
                node = node.next;
            }
            return node;
        }
    }

    /**
     * 根據(jù)位置跟新節(jié)點(diǎn)
     * @param index
     * @param node
     */
    public void updateNode(int index,Node node){
        //TODO:判斷查詢位置是否合法
        if(index < 0 && index > size) {
            throw new IndexOutOfBoundsException("超出鏈表查詢范圍");
        }
        if(size == 0) {
            throw new IndexOutOfBoundsException("暫無鏈表");
        }else{
            Node findNode = findNode(index);
            findNode.data = node.data;
        }
    }

    /**
     * 刪除元素
     * @param index
     */
    public void deleteNode(int index){
        //TODO:判斷查詢位置是否合法
        if(index < 0 && index > size) {
            throw new IndexOutOfBoundsException("超出鏈表查詢范圍");
        }
        if(size == 0) {
            throw new IndexOutOfBoundsException("暫無鏈表");
        }else{
            Node node = findNode(index);
            if(index == 0) {
                head = node.next;
            }else if(index == size - 1) {
                node.next = null;
            }else{
                Node preNode = findNode(index - 1);
                preNode.next = node.next;
            }
            //TODO:插入后鏈表長度減1
            size--;
        }
    }

    //包含元素跟指針
    private static class Node{
        int data;
        Node next;
        public Node(int data) {
            this.data = data;
        }
    }

    public void output(){
        Node node = head;
        if(node != null) {
            for (int i = 0 ; i < size ; i++){
                System.out.println("Node : " + node.data);
                node = node.next;
            }
        }
    }

    public static void main(String [] args){
        MyLinkedList myLinkedList = new MyLinkedList();
        myLinkedList.insert(3,0);
        myLinkedList.insert(5,1);
        myLinkedList.insert(7,2);
        myLinkedList.insert(9,3);
        myLinkedList.insert(1,1);
        myLinkedList.output();
        myLinkedList.deleteNode(0);
        myLinkedList.deleteNode(2);
        myLinkedList.output();
    }

總結(jié);鏈表再刪除和插入方面效率遠(yuǎn)高于更新跟查找

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蝙昙,一起剝皮案震驚了整個(gè)濱河市闪萄,隨后出現(xiàn)的幾起案子梧却,更是在濱河造成了極大的恐慌奇颠,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,692評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件放航,死亡現(xiàn)場離奇詭異烈拒,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)广鳍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門荆几,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人赊时,你說我怎么就攤上這事吨铸。” “怎么了祖秒?”我有些...
    開封第一講書人閱讀 162,995評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵诞吱,是天一觀的道長。 經(jīng)常有香客問我竭缝,道長房维,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,223評(píng)論 1 292
  • 正文 為了忘掉前任抬纸,我火速辦了婚禮咙俩,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘湿故。我一直安慰自己阿趁,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評(píng)論 6 388
  • 文/花漫 我一把揭開白布坛猪。 她就那樣靜靜地躺著脖阵,像睡著了一般。 火紅的嫁衣襯著肌膚如雪砚哆。 梳的紋絲不亂的頭發(fā)上独撇,一...
    開封第一講書人閱讀 51,208評(píng)論 1 299
  • 那天屑墨,我揣著相機(jī)與錄音,去河邊找鬼纷铣。 笑死卵史,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的搜立。 我是一名探鬼主播以躯,決...
    沈念sama閱讀 40,091評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼啄踊!你這毒婦竟也來了忧设?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,929評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤颠通,失蹤者是張志新(化名)和其女友劉穎址晕,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體顿锰,經(jīng)...
    沈念sama閱讀 45,346評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡谨垃,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了硼控。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片刘陶。...
    茶點(diǎn)故事閱讀 39,739評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖牢撼,靈堂內(nèi)的尸體忽然破棺而出匙隔,到底是詐尸還是另有隱情,我是刑警寧澤熏版,帶...
    沈念sama閱讀 35,437評(píng)論 5 344
  • 正文 年R本政府宣布纷责,位于F島的核電站,受9級(jí)特大地震影響纳决,放射性物質(zhì)發(fā)生泄漏碰逸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評(píng)論 3 326
  • 文/蒙蒙 一阔加、第九天 我趴在偏房一處隱蔽的房頂上張望饵史。 院中可真熱鬧,春花似錦胜榔、人聲如沸胳喷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吭露。三九已至,卻和暖如春尊惰,著一層夾襖步出監(jiān)牢的瞬間讲竿,已是汗流浹背泥兰。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留题禀,地道東北人鞋诗。 一個(gè)月前我還...
    沈念sama閱讀 47,760評(píng)論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像迈嘹,于是被迫代替她去往敵國和親削彬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評(píng)論 2 354

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