国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【數(shù)據(jù)結(jié)構(gòu)】實現(xiàn)單鏈表的增刪查

這篇具有很好參考價值的文章主要介紹了【數(shù)據(jù)結(jié)構(gòu)】實現(xiàn)單鏈表的增刪查。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

1.定義接口

public interface SeqList<E>{
    //默認(rèn)尾插
    void add(E element);
    // 在線性表中插入新元素,插入后的元素下標(biāo)為index
    void add(int index,E element);
    //頭插
    public void addFirst(E val);
    // 刪除當(dāng)前線性表中索引為index的元素,返回刪除的元素值
    E removeByIndex(int index);
    // 刪除當(dāng)前線性表中第一個值為element的元素
    void removeByValue(E element);
    // 刪除當(dāng)前線性表中所有值為element的元素
    void removeAllValue(E element);
    // 將當(dāng)前線性表中index位置的元素替換為element,返回替換前的元素值
    E set(int index,E element);
    //返回索引位index的元素
    E get(int index);
    //查詢是否包含element元素
    boolean contains(E element);
}

2.無頭單鏈表實現(xiàn)接口

鏈表類和節(jié)點類的定義:

public class SingleLinkedList<E> implements SeqList<E>{
    private Node head ;//第一節(jié)車廂的地址
    private int size;//車廂節(jié)點的個數(shù),保存的元素個數(shù)

    //定義一個車廂類,車廂作為火車的私有內(nèi)部類,對外部完全隱藏
    private class Node{
        E val;//保存的元素
        Node next;//下一節(jié)車廂的地址
        //構(gòu)造方法
        Node(E val){
            this.val=val;
        }
    }
 }

2.1 頭插addFirst

public void addFirst(E val){
	Node node=new Node(val);
	node.next=head;
	node=head;
	size++;
}

圖解:

【數(shù)據(jù)結(jié)構(gòu)】實現(xiàn)單鏈表的增刪查,數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),java,鏈表

2.2 尾插add

從中間位置插入:

	@Override
    public void add(int index, E element) {
        if(index<0||index>size){
            throw new IllegalArgumentException("add index ILLegal");
        }
        //判斷沒有前驅(qū)的情況
        if(index==0){
            addFirst(element);
            return;
        }
        //中間位置插入
        Node prey=head;
        for(int i=0;i<index-1;i++){
            prey=prey.next;
        }
        Node node=new Node(element);
        node.next=prey.next;
        prey.next=node;
        size++;
    }

圖解:假定index=2
【數(shù)據(jù)結(jié)構(gòu)】實現(xiàn)單鏈表的增刪查,數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),java,鏈表

尾插:

    @Override
    public void add(E element) {
        add(size,element);
    }

2.3 刪除元素remove

刪除當(dāng)前線性表中索引為index的元素,返回刪除的元素值:

    @Override
    public E removeByIndex(int index) {
        if(rangeCheck(index)){
            throw new IllegalArgumentException("remove index Illegal");
        }
        //頭節(jié)點的刪除
        if(index==0){
            Node node=head;
            head=head.next;
            node.next=null;
            size--;
            return node.val;
        }
        //中間位置刪除
        Node prey=head;
        for(int i=0;i<index-1;i++){
            prey=prey.next;
        }
        Node node=prey.next;
        prey.next=node.next;
        node.next=null;
        size--;
        return node.val;
    }

圖解:

【數(shù)據(jù)結(jié)構(gòu)】實現(xiàn)單鏈表的增刪查,數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),java,鏈表

刪除當(dāng)前線性表中第一個值為element的元素:

    @Override
    public void removeByValue(E element) {
        //1.base case
        if(head==null){
            return;
        }
        //2.判斷頭節(jié)點恰好是待刪除的節(jié)點
        if(head.val.equals(element)){
            head=head.next;
            size--;
            return;
        }
        //3.此時頭節(jié)點不為空其一定不是待刪除的節(jié)點
        Node prey=head;
        while(prey.next!=null){
            if(prey.next.equals(element)){
                prey.next=prey.next.next;
                size--;
                return;
            }
            prey=prey.next;
        }
        //4.當(dāng)前鏈表不存在值為element的元素
        System.out.println("當(dāng)前鏈表不存在值為"+element+"的元素");
    }

刪除當(dāng)前線性表中所有值為element的元素:

    @Override
    public void removeAllValue(E element) {
        //1.base case
        if(head==null){
            return;
        }
        //2.若頭節(jié)點就是待刪除的節(jié)點且出現(xiàn)連續(xù)的待刪除的節(jié)點
        while(head!=null && head.val.equals(element)){
            head=head.next;
            size--;
        }
        //整個鏈表已經(jīng)刪完了
        if(head==null){
            return;
        }
        //3.頭節(jié)點一定不是待刪除的元素且鏈表不為空
        Node prey=head;
        while(prey.next!=null){
            if(prey.next.val.equals(element)){
                prey.next=prey.next.next;
                size--;
            }else{
                //只有后繼節(jié)點不是待刪除的節(jié)點才能移動Prey的引用
                prey=prey.next;
            }
        }
    }

2.4 修改元素set

將當(dāng)前線性表中index位置的元素替換為element,返回替換前的元素值:

    // 將當(dāng)前線性表中index位置的元素替換為element,返回替換前的元素值
    @Override
    public E set(int index, E element) {
        if(!rangeCheck(index)){
            throw new IllegalArgumentException("set index illegal");
        }
        Node x=head;
        //遍歷,走到index對應(yīng)的元素
        for (int i = 0; i < index; i++) {
            x=x.next;
        }
        E oldVal=x.val;
        x.val=element;
        return oldVal;
    }
    //合法性校驗
    private boolean rangeCheck(int index){
        if(index<0||index>=size){
            return false;
        }
        return true;
    }

2.5 獲取元素get

返回索引為index的元素:

    @Override
    public E get(int index) {
        if(!rangeCheck(index)){
            throw new IllegalArgumentException("get index illegal");
        }
        Node x=head;
        for(int i=0;i<index;i++){
            x=x.next;
        }
        return x.val;
    }

3.帶頭單鏈表實現(xiàn)接口

【數(shù)據(jù)結(jié)構(gòu)】實現(xiàn)單鏈表的增刪查,數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),java,鏈表

由于單鏈表中都需要額外處理頭結(jié)點的情況,引入一個虛擬頭結(jié)點,這個節(jié)點不存在具體的值,就作為鏈表的頭來使用,使每個有值的節(jié)點都有一個前驅(qū)。(所有操作都統(tǒng)一了,無論是插入還是刪除,都可以看作是中間位置的插入和刪除)

鏈表類和節(jié)點類的定義:

public class SingleLinkedListWithHead <E> implements SeqList<E>{
    //當(dāng)前鏈表一定存在火車頭且不存儲任何元素
    private Node dummyHead=new Node(null);
    //具體的元素個數(shù)
    private int size;
    private class Node{
        E val;
        Node next;
        Node(E val){
            this.val=val;
        }
    }
}

3.1 頭插addFirst

    public void addFirst(E val){
        Node node=new Node(val);
        node.next=dummyHead.next;
        dummyHead.next=node;
        size++;
    }

圖解:

【數(shù)據(jù)結(jié)構(gòu)】實現(xiàn)單鏈表的增刪查,數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu),java,鏈表文章來源地址http://www.zghlxwxcb.cn/news/detail-628706.html

3.2 尾插add

    @Override
    public void add(E element) {
        add(size,element);
        return;
    }

    @Override
    public void add(int index, E element) {
        if(index<0||index>size){
            throw new IllegalArgumentException("Remove index illegal");
        }
        Node prey=dummyHead;
        for(int i=0;i<index;i++){
            prey=prey.next;
        }
        Node node=new Node(element);
        node.next=prey.next;
        prey.next=node;
        size++;
    }

3.3 刪除元素remove

    @Override
    public void removeAllValue(E element) {
        //prey一定指向不是待刪除的節(jié)點
        Node prev=dummyHead;
        while(prev.next!=null){
            if(prev.next.val==element){
                prev.next=prev.next.next;
                size--;
            }else{
                prev=prev.next;
            }
        }
    }

3.4 判斷是否包含元素element

    @Override
    public boolean contains(E element) {
        while(dummyHead.next!=null){
            if(dummyHead.next.val.equals(element)){
                return true;
            }
            dummyHead.next=dummyHead.next.next;
        }
        return false;
    }

到了這里,關(guān)于【數(shù)據(jù)結(jié)構(gòu)】實現(xiàn)單鏈表的增刪查的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【數(shù)據(jù)結(jié)構(gòu)】單鏈表的實現(xiàn)

    【數(shù)據(jù)結(jié)構(gòu)】單鏈表的實現(xiàn)

    ??個人主頁:平凡的小蘇 ??學(xué)習(xí)格言:別人可以拷貝我的模式,但不能拷貝我不斷往前的激情 ??C語言專欄:https://blog.csdn.net/vhhhbb/category_12174730.html ??數(shù)據(jù)結(jié)構(gòu)專欄:https://blog.csdn.net/vhhhbb/category_12211053.html ? ? ? ? 家人們更新不易,你們的??點贊??和?關(guān)注?真的對我

    2023年04月09日
    瀏覽(93)
  • 【數(shù)據(jù)結(jié)構(gòu)】-- 單鏈表的實現(xiàn)

    【數(shù)據(jù)結(jié)構(gòu)】-- 單鏈表的實現(xiàn)

    在前面我們學(xué)習(xí)了順序表,順序表在數(shù)組的基礎(chǔ)上提供了很多現(xiàn)成的方法,方便了我們對數(shù)據(jù)的管理,但是我們也發(fā)現(xiàn)順序表有著許多不足: 在處理大型的數(shù)據(jù)時,需要頻繁的增容且在中間刪除或插入數(shù)據(jù)時需要遍歷順序表,這些性質(zhì)導(dǎo)致了順序表的 效率較低 。這時我們就

    2024年04月27日
    瀏覽(110)
  • 【數(shù)據(jù)結(jié)構(gòu)—單鏈表的實現(xiàn)】

    【數(shù)據(jù)結(jié)構(gòu)—單鏈表的實現(xiàn)】

    提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 目錄 前言 1. 鏈表的概念及結(jié)構(gòu) 2. 單鏈表的實現(xiàn) 2.1單鏈表頭文件——功能函數(shù)的定義 2.2單鏈表源文件——功能函數(shù)的實現(xiàn) 2.3 單鏈表源文件——功能的測試 3.具體的理解操作圖 4. 鏈表的分類 總結(jié) 世上

    2024年02月05日
    瀏覽(93)
  • 【(數(shù)據(jù)結(jié)構(gòu))— 單鏈表的實現(xiàn)】

    【(數(shù)據(jù)結(jié)構(gòu))— 單鏈表的實現(xiàn)】

    概念: 鏈表是?種 物理存儲結(jié)構(gòu)上非連續(xù)、 非順序的存儲結(jié)構(gòu),數(shù)據(jù)元素的 邏輯順序 是通過鏈表中的 指針鏈接 次序?qū)崿F(xiàn)的 。 鏈表的結(jié)構(gòu)跟???廂相似,淡季時?次的?廂會相應(yīng)減少,旺季時?次的?廂會額外增加?節(jié)。只需要將???的某節(jié)?廂去掉/加上,不會影響

    2024年02月08日
    瀏覽(101)
  • 【數(shù)據(jù)結(jié)構(gòu)】單鏈表的層層實現(xiàn)!! !

    【數(shù)據(jù)結(jié)構(gòu)】單鏈表的層層實現(xiàn)!! !

    關(guān)注小莊 頓頓解饞(●’?’●) 上篇回顧 我們上篇學(xué)習(xí)了本質(zhì)為數(shù)組的數(shù)據(jù)結(jié)構(gòu)—順序表,順序表支持下標(biāo)隨機(jī)訪問而且高速緩存命中率高,然而可能造成空間的浪費,同時增加數(shù)據(jù)時多次移動會造成效率低下,那有什么解決之法呢?這就得引入我們鏈表這種數(shù)據(jù)結(jié)構(gòu) 概念

    2024年03月12日
    瀏覽(1048)
  • 【數(shù)據(jù)結(jié)構(gòu)】單鏈表的簡單實現(xiàn)

    【數(shù)據(jù)結(jié)構(gòu)】單鏈表的簡單實現(xiàn)

    提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 單鏈表是一種鏈?zhǔn)酱嫒〉臄?shù)據(jù)結(jié)構(gòu),用一組地址任意的存儲單元存放線性表中的數(shù)據(jù)元素。鏈表中的數(shù)據(jù)是以結(jié)點來表示的,每個結(jié)點的構(gòu)成:元素(數(shù)據(jù)元素的映象) + 指針(指示后繼元素存儲位置),元

    2024年02月04日
    瀏覽(95)
  • 【數(shù)據(jù)結(jié)構(gòu)】雙向鏈表的增刪查改(C 代碼實現(xiàn))

    【數(shù)據(jù)結(jié)構(gòu)】雙向鏈表的增刪查改(C 代碼實現(xiàn))

    引入雙向鏈表:關(guān)于單鏈表的問題與討論 單鏈表存在的毛?。?因為單鏈表 只能單向 遍歷鏈表, 對于 前插 這個操作,單鏈表必 須得找到所需前插節(jié)點位置的前一個 ,那么這時就得 從頭指針重新遍歷一次 鏈表,會造成時間復(fù)雜度大大增加。 沒有頭節(jié)點(哨兵位)無法刪除

    2024年02月08日
    瀏覽(96)
  • 數(shù)據(jù)結(jié)構(gòu):單鏈表的實現(xiàn)(C語言)

    數(shù)據(jù)結(jié)構(gòu):單鏈表的實現(xiàn)(C語言)

    個人主頁 : 水月夢鏡花 個人專欄 : 《C語言》 《數(shù)據(jù)結(jié)構(gòu)》 本博客將要實現(xiàn)的無頭單向不循環(huán)鏈表。 我們將節(jié)點定義為如下結(jié)構(gòu): 其成員變量有data,next。 將int重命名為STLDataType,方便我們以后修改數(shù)據(jù)域的內(nèi)容。 動態(tài)申明一個空間,來放置數(shù)據(jù)。如下: 將data的內(nèi)容置

    2024年02月14日
    瀏覽(98)
  • 初階數(shù)據(jù)結(jié)構(gòu)之單鏈表的實現(xiàn)(四)

    初階數(shù)據(jù)結(jié)構(gòu)之單鏈表的實現(xiàn)(四)

    鏈表的概念 :鏈表是一種物理存儲結(jié)構(gòu)上非連續(xù)、非順序的存儲結(jié)構(gòu),數(shù)據(jù)元素的邏輯順序是通過鏈表中的指針鏈接次序?qū)崿F(xiàn)的 。 所謂的邏輯結(jié)構(gòu)其實就是能讓我們自己能夠更好的理解這個東西是什么?那么我們就用畫圖來理解理解吧??!在單鏈表中,存放著兩個量,一個

    2024年02月06日
    瀏覽(86)
  • 數(shù)據(jù)結(jié)構(gòu)——單鏈表的實現(xiàn)(c語言版)

    數(shù)據(jù)結(jié)構(gòu)——單鏈表的實現(xiàn)(c語言版)

    前言 ? ? ? ? ? 單鏈表作為順序表的一種,了解并且熟悉它的結(jié)構(gòu)對于我們學(xué)習(xí)更加復(fù)雜的數(shù)據(jù)結(jié)構(gòu)是有一定意義的。雖然單鏈表有一定的缺陷,但是單鏈表也有它存在的價值,?它也是作為其他數(shù)據(jù)結(jié)構(gòu)的一部分出現(xiàn)的,比如在圖,哈希表中。 目錄 1.鏈表節(jié)點的結(jié)構(gòu) 2.頭插

    2024年02月13日
    瀏覽(94)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包