成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Java數(shù)據(jù)結(jié)構(gòu)與算法——鏈表

CKJOKER / 2868人閱讀

摘要:前言數(shù)據(jù)結(jié)構(gòu)與算法專題會不定時更新,歡迎各位讀者監(jiān)督。本文介紹另一種數(shù)據(jù)結(jié)構(gòu)鏈表,包括鏈表的特點特點鏈表的創(chuàng)建刪除插入和輸出,文末給出代碼和一道常見的關(guān)于鏈表的面試題。

聲明:碼字不易,轉(zhuǎn)載請注明出處,歡迎文章下方討論交流。

前言:Java數(shù)據(jù)結(jié)構(gòu)與算法專題會不定時更新,歡迎各位讀者監(jiān)督。本文介紹另一種數(shù)據(jù)結(jié)構(gòu)——鏈表,包括鏈表的特點特點、鏈表的創(chuàng)建、刪除、插入和輸出,文末給出java代碼和一道常見的關(guān)于鏈表的面試題。

1、鏈表的概念和特點

鏈表是由若干結(jié)點組成,每個結(jié)點至少包括兩部分信息:一個是元素數(shù)據(jù),一個是指向下一個(上一個)元素地址的指針。鏈表的存儲在物理上是非連續(xù)、非順序的存儲結(jié)構(gòu),數(shù)據(jù)元素之間是通過每個元素的指針來關(guān)聯(lián)的。

與數(shù)組相比,鏈表獨特的存儲結(jié)構(gòu)克服了數(shù)組提前需要設(shè)置長度的缺點,在運行時可以動態(tài)的快速的添加和刪除元素;計算機的存儲空間并非連續(xù)的,而鏈表則可以靈活的使用存儲空間,能更好的對計算機內(nèi)存進行動態(tài)管理。

鏈表分為單鏈表、雙鏈表、和循環(huán)鏈表,雙鏈表的每個結(jié)點有兩個指針,分別指向前一個元素和后一個元素,循環(huán)鏈表的尾結(jié)點指針不是null,而是指向頭結(jié)點元素的地址。

2、鏈表的操作

鏈表的操作包括了創(chuàng)建、刪除、插入、輸出。
創(chuàng)建就是空間的分配,將頭、尾指針及鏈表結(jié)點個數(shù)等初始化。
刪除和插入根據(jù)被操作元素的位置可以細分為頭刪除(插入),尾刪除(插入),中間刪除(插入),以下詳細介紹。

創(chuàng)建和輸出比較簡單,不做具體分析,后面直接給出代碼

2.1 插入操作

插入分為頭插入,尾插入,中間插入

頭插入
頭插入實際上是增加一個新節(jié)點,然后把新增加的結(jié)點指針指向原來頭指針指向的元素,再把頭指針指向新增的節(jié)點。

尾插入
尾插入也是增加一個新節(jié)點,該節(jié)點指針置為null,然后把原尾結(jié)點指針指向新增加的節(jié)點,最后把尾指針指向新增加的節(jié)點即可。

中間插入
中間插入稍復(fù)雜,首先增加一個節(jié)點,然后新增節(jié)點的指針指向插入位置的后一個節(jié)點,把插入位置的前一個節(jié)點指針指向新插入節(jié)點即可。

2.2 刪除操作

刪除與插入類似,根據(jù)被操作元素的位置分為頭刪除,尾刪除,中間刪除

頭刪除
刪除頭元素時,先將頭指針指向下一個節(jié)點,然后把原頭結(jié)點的指針置空即可

尾刪除
刪除尾元素時,首先找到鏈表倒數(shù)第2個元素,然后把尾指針指向這個元素,接著把原倒數(shù)第2個元素的指針置空。

中間刪除
刪除中間元素相對復(fù)雜一些,首先將要刪除的節(jié)點的前一個節(jié)點指針指向要刪除的節(jié)點的下一個節(jié)點,然后把要刪除節(jié)點的指針置空。

3、java代碼實現(xiàn)

鏈表是由一系列節(jié)點組成,首先是節(jié)點部分

public class Node {
    private int data;  //數(shù)據(jù)
    private Node next;  //指針
    
    public int getData() {
        return data;
    }
    public void setData(int data) {
        this.data = data;
    }
    public Node getNext() {
        return next;
    }
    public void setNext(Node next) {
        this.next = next;
    }    
}

鏈表節(jié)點部分的代碼實現(xiàn)了兩個部分,一個是數(shù)據(jù),一個是指向下一個節(jié)點的指針(由于java中摒棄了c++中的指針概念,準(zhǔn)確的說應(yīng)該是引用)
以下是鏈表的代碼實現(xiàn):

public class Link {
    private int size = 0;
    private Node first;
    private Node last;
    
    /*鏈表初始化 */
    public Link(){}
    
    /**
     * 返回鏈表長度
     * @return 返回鏈表長度
     */
    public int getLength(){
        return size;
    }
    
    /**
     * 獲取指定位置的節(jié)點
     * @param index 位置[0~size]
     * @return 
     */
    public Node get(int index){
        Node temp = first;
        for(int i=0;isize){
                throw new IndexOutOfBoundsException("刪除位置超界");
            }else{
                Node temp = get(index-1);
                temp.setNext(get(index));
                temp.setNext(null);
                size--;
            }
        }
    }
    
    /**
     * 獲取鏈表
     */
    public void getAll(){
        Node temp = first;
        System.out.println(temp.getData());
        while(temp.getNext()!=null){
            System.out.print(temp.getData()+"-->");
            temp = temp.getNext();
            size--;
        }
    }    
}
4、測試代碼
public class LinkTest {
    public static void main(String[] args) {
        Link link = new Link();
        link.addHead(1); //1
        link.printLink();
        
        link.addHead(5); //5->1
        link.printLink();
        
        link.addTail(9); //5->1->9
        link.printLink();
        
        link.addTail(7); //5->1->9->7
        link.printLink();
        
        link.add(3,8);  //5->1->9->8->7
        link.printLink();        
        System.out.println("鏈表長度:"+link.getLength()); //5
        
        link.deleFirst();  //1->9->8->7
        link.printLink();
        
        link.deleLast();  //1->9->8
        link.printLink();
        
        link.deleMid(1);  //1->8
        link.printLink();
        
        System.out.println("鏈表長度:"+link.getLength()); //2        
    }
}
5.小結(jié)

鏈表的操作稍稍復(fù)雜,插入和刪除要考慮很多因素(邊界條件、異常),寫完代碼要逐個測試,出現(xiàn)不一致的情況逐步調(diào)試、跟蹤變量。記住插入和刪除的步驟(六張圖),編碼時仔細一點一般不會出現(xiàn)問題。

以上代碼經(jīng)過測試無誤,歡迎收藏轉(zhuǎn)發(fā),歡迎下方討論交流^_^
碼字——>畫圖——>編碼——>調(diào)試 一趟下來不容易,如果對您有幫助請收藏點贊

更新:我的另一篇的文章Java數(shù)據(jù)結(jié)構(gòu)與算法——鏈表面試介紹了鏈表的特點,使用場景、鏈表的性能分析以及一道經(jīng)典的鏈表面試題——鏈的反轉(zhuǎn)問題,請移步閱讀參考。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/71039.html

相關(guān)文章

  • Java數(shù)據(jù)結(jié)構(gòu)算法——鏈表(面試)

    摘要:前言數(shù)據(jù)結(jié)構(gòu)與算法專題會不定時更新,歡迎各位讀者監(jiān)督。指針反轉(zhuǎn)實現(xiàn)鏈表反轉(zhuǎn)代碼反轉(zhuǎn)鏈表獲取當(dāng)前下下個元素測試代碼部分用到了上篇文章數(shù)據(jù)結(jié)構(gòu)與算法鏈表的代碼段,請移步獲取。 聲明:碼字不易,轉(zhuǎn)載請注明出處,歡迎文章下方討論交流。 前言:Java數(shù)據(jù)結(jié)構(gòu)與算法專題會不定時更新,歡迎各位讀者監(jiān)督。本文是上篇文章Java數(shù)據(jù)結(jié)構(gòu)與算法——鏈表的擴展篇,介紹鏈表的特點,使用場景、鏈表的性能分析以...

    keke 評論0 收藏0
  • 數(shù)據(jù)結(jié)構(gòu) - 收藏集 - 掘金

    面試舊敵之紅黑樹(直白介紹深入理解) - Android - 掘金 讀完本文你將了解到: 什么是紅黑樹 黑色高度 紅黑樹的 5 個特性 紅黑樹的左旋右旋 指定節(jié)點 x 的左旋 右圖轉(zhuǎn)成左圖 指定節(jié)點 y 的右旋左圖轉(zhuǎn)成右圖 紅黑樹的平衡插入 二叉查找樹的插入 插入后調(diào)整紅黑樹結(jié)構(gòu) 調(diào)整思想 插入染紅后... java 多線程同步以及線程間通信詳解 & 消費者生產(chǎn)者模式 & 死鎖 & Thread...

    leeon 評論0 收藏0
  • Java實現(xiàn)單向鏈表基本功能

    摘要:一前言最近在回顧數(shù)據(jù)結(jié)構(gòu)與算法,有部分的算法題用到了棧的思想,說起棧又不得不說鏈表了。 一、前言 最近在回顧數(shù)據(jù)結(jié)構(gòu)與算法,有部分的算法題用到了棧的思想,說起棧又不得不說鏈表了。數(shù)組和鏈表都是線性存儲結(jié)構(gòu)的基礎(chǔ),棧和隊列都是線性存儲結(jié)構(gòu)的應(yīng)用~ 本文主要講解單鏈表的基礎(chǔ)知識點,做一個簡單的入門~如果有錯的地方請指正 二、回顧與知新 說起鏈表,我們先提一下數(shù)組吧,跟數(shù)組比較一下就很理解鏈...

    idisfkj 評論0 收藏0

發(fā)表評論

0條評論

CKJOKER

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<