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

資訊專(zhuān)欄INFORMATION COLUMN

Java 數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)(DataStructure)1

宋華 / 951人閱讀

摘要:雙向鏈表的實(shí)現(xiàn),必須注意雙向鏈表的和兩個(gè)指針的正確指向,以及插入和刪除過(guò)程中指向操作增減的有序性。定義節(jié)點(diǎn),節(jié)點(diǎn)數(shù)據(jù)類(lèi)型為,可以通過(guò)多態(tài)方式具象化為其他類(lèi)型定義從頭尾節(jié)點(diǎn)增加節(jié)點(diǎn)定義從頭尾節(jié)點(diǎn)刪除節(jié)點(diǎn)

線性表和鏈表

單向鏈表利用了類(lèi)的自引用,實(shí)現(xiàn)了類(lèi)似指針的效果。
雙向鏈表的實(shí)現(xiàn),必須注意雙向鏈表的head和back兩個(gè)指針的正確指向,以及插入和刪除過(guò)程中指向操作增減的有序性。

下面幾圖從java面向?qū)ο蟮慕嵌日f(shuō)明了單向雙向鏈表的邏輯結(jié)構(gòu),類(lèi)的自引用使得邏輯指向成為可能。

以下兩圖說(shuō)明了添加刪除頭尾節(jié)點(diǎn)時(shí)執(zhí)行的順序:

  

添加頭結(jié)點(diǎn)時(shí)先加一個(gè)臨時(shí)節(jié)點(diǎn),建立此臨時(shí)節(jié)點(diǎn)和原頭節(jié)點(diǎn)后使此臨時(shí)節(jié)點(diǎn)為新頭結(jié)點(diǎn)即可。
刪除尾節(jié)點(diǎn)時(shí)先使原次頭結(jié)點(diǎn)為新頭結(jié)點(diǎn),然后刪除原頭節(jié)點(diǎn)和新頭結(jié)點(diǎn)的連接后,再刪除新頭結(jié)點(diǎn)和原頭結(jié)點(diǎn)的連接。

尾節(jié)點(diǎn)的處理方法類(lèi)似。
這樣的刪除方法能夠完全釋放所有的占用空間。

下面是雙向鏈表的實(shí)現(xiàn)過(guò)程,包括鏈表類(lèi)NodeList的插入刪除操作。

public class TestList 
{
    public static void main(String[] Args) 
    {
        NodeList OhMyGod = new NodeList();

        Boolean b = Boolean.TRUE;
        Character c = new Character("$");
        Integer i = new Integer(34567);
        String s = "hello";

        OhMyGod.insertFromBack(b);
        OhMyGod.print();
        OhMyGod.insertFromHead(c);
        OhMyGod.print();
        OhMyGod.insertFromBack(i);
        OhMyGod.print();
        OhMyGod.insertFromHead(s);
        OhMyGod.print();
        System.out.println(OhMyGod.deleteFromBack());
        OhMyGod.print();
        System.out.println(OhMyGod.deleteFromBack());
        OhMyGod.print();
        System.out.println(OhMyGod.deleteFromBack());
        OhMyGod.print();
        System.out.println(OhMyGod.deleteFromBack());
        OhMyGod.print();
    }
}

class Node ///定義節(jié)點(diǎn),節(jié)點(diǎn)數(shù)據(jù)類(lèi)型為Object,可以通過(guò)多態(tài)方式具象化為其他類(lèi)型
{
    private Node headPointer;
    private Object data;
    private Node backPointer;


    public Node(Node hp,Object o,Node bp)
    {
        headPointer = hp;
        backPointer = bp;
        data = o;
    }
    public Node()
    {
        this(null,null,null);
    }
    public Node(Object o)
    {
        this(null,o,null);
    }
    public Node(Node hp,Object o)
    {
        this(hp,o,null);
    }
    public Node(Object o,Node bp)
    {
        this(null,o,bp);
    }

    public Node getHeadPointer() {
        return headPointer;
    }
    public Object getData() {
        return data;
    }
    public Node getBackPointer() {
        return backPointer;
    }
    public void setHeadPointer(Node headPointer) {
        this.headPointer = headPointer;
    }
    public void setBackPointer(Node backPointer) {
        this.backPointer = backPointer;
    }
}

class NodeListEmptyExcption extends RuntimeException
{

    private static final long serialVersionUID = 5130245130776457112L;
    public NodeListEmptyExcption(String name)
    {
        super("NodeList:"+name+" is Empty !");
    }
}

class NodeList
{
    private String listName;
    private Node headNode;
    private Node backNode;
    public NodeList()
    {
        this("default");
    }
    public NodeList(String listName) 
    {
        this.listName = listName;
        headNode = backNode = null;
    }
    public Boolean isEmpty()
    {
        return headNode == null;
    }
    ///////////////////////定義從頭尾節(jié)點(diǎn)增加節(jié)點(diǎn)
    public void insertFromHead(Object o)
    {
        if(isEmpty())
            headNode = backNode = new Node(o);
        else 
        {
            //headNode = new Node(o,headNode);
            Node tempNode = new Node(o);
            tempNode.setBackPointer(headNode);
            headNode.setHeadPointer(tempNode);
            headNode = tempNode;


        }
    }
    public void insertFromBack(Object o)
    {
        if(isEmpty())
            headNode = backNode = new Node(o);
        else
        {
            Node tempNode = new Node(o);
            backNode.setBackPointer(tempNode);
            tempNode.setHeadPointer(backNode);
            backNode = tempNode;
        }
    }
    //////////////////////////定義從頭尾節(jié)點(diǎn)刪除節(jié)點(diǎn)
    public Object deleteFromHead() throws NodeListEmptyExcption
    {
        if(isEmpty())
            throw new NodeListEmptyExcption(listName);

        Object removedata = headNode.getData();

        if(headNode.equals(backNode))
        {
            headNode = backNode = null;
        }

        else 
        {
            headNode = headNode.getBackPointer();
            headNode.getHeadPointer().setBackPointer(null);
            headNode.setHeadPointer(null);  
        }
        return removedata;
    }
    public Object deleteFromBack() throws NodeListEmptyExcption
    {
        if(isEmpty())
            throw new NodeListEmptyExcption(listName);

        Object removedata = backNode.getData();
        if(headNode.equals(backNode))
        {
            headNode = backNode = null;
        }
        else 
        {
            backNode = backNode.getHeadPointer();
            backNode.getBackPointer().setHeadPointer(null);
            backNode.setBackPointer(null);
        }   
        return removedata;
    }
    public void print()
    {
        if(isEmpty())
        {
            System.out.println("Node List "+listName+" is empty !");
        return;
        }
        Node currentNode = headNode;
        while(currentNode!=null)
        {
            System.out.print(currentNode.getData().toString()+" ");
            currentNode  = currentNode.getBackPointer();
        }
        System.out.println("
");
    }
}

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

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

相關(guān)文章

  • Java? 教程(嵌套類(lèi))

    嵌套類(lèi) Java編程語(yǔ)言允許你在另一個(gè)類(lèi)中定義類(lèi),這樣的類(lèi)稱(chēng)為嵌套類(lèi),如下所示: class OuterClass { ... class NestedClass { ... } } 術(shù)語(yǔ):嵌套類(lèi)分為兩類(lèi):靜態(tài)和非靜態(tài),聲明為static的嵌套類(lèi)稱(chēng)為靜態(tài)嵌套類(lèi),非靜態(tài)嵌套類(lèi)稱(chēng)為內(nèi)部類(lèi)。 class OuterClass { ... stati...

    Cheng_Gang 評(píng)論0 收藏0
  • Java 數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)DataStructure)2

    摘要:堆??梢钥闯墒怯刑囟ㄒ?guī)則為的線性表,特定規(guī)則就是先進(jìn)后出,后進(jìn)先出,可以看成是我們的先的要后,所以利用這一點(diǎn)可以通過(guò)繼承或組合的方式來(lái)構(gòu)建堆棧。鑒于上面這張物理結(jié)構(gòu)和邏輯結(jié)構(gòu),我們采用提供的來(lái)構(gòu)建主存儲(chǔ)結(jié)構(gòu),即節(jié)點(diǎn)的線性表以達(dá)到索引的目的。 堆棧 可以看成是有特定規(guī)則為的線性表,特定規(guī)則就是先進(jìn)后出,后進(jìn)先出,可以看成是我們List的先insertFromHead的要后deleteF...

    simpleapples 評(píng)論0 收藏0
  • 數(shù)據(jù)結(jié)構(gòu)-棧

    摘要:棧也稱(chēng)為后進(jìn)先出表?xiàng)5膽?yīng)用場(chǎng)景操作撤銷(xiāo)例如將操作的每組數(shù)據(jù)存入棧中,如果想要撤銷(xiāo),只需要彈出棧頂元素,就可以恢復(fù)上一步操作了。最后執(zhí)行完成,根據(jù)棧的結(jié)構(gòu)開(kāi)始彈出數(shù)據(jù),一步一步再走回方法。 數(shù)據(jù)結(jié)構(gòu)-棧 定義 棧(英語(yǔ):stack)又稱(chēng)為堆?;蚨询B,棧作為一種數(shù)據(jù)結(jié)構(gòu),它按照先進(jìn)后出的原則存儲(chǔ)數(shù)據(jù),先進(jìn)入的數(shù)據(jù)被壓入棧底,最后的數(shù)據(jù)在棧頂,需要讀數(shù)據(jù)的時(shí)候從棧頂開(kāi)始彈出數(shù)據(jù)(最后一個(gè)數(shù)據(jù)...

    TalkingData 評(píng)論0 收藏0
  • 數(shù)據(jù)結(jié)構(gòu)-數(shù)組

    摘要:數(shù)據(jù)結(jié)構(gòu)數(shù)組數(shù)組數(shù)據(jù)結(jié)構(gòu)中最基本的一個(gè)結(jié)構(gòu)就是線性結(jié)構(gòu),而線性結(jié)構(gòu)又分為連續(xù)存儲(chǔ)結(jié)構(gòu)和離散存儲(chǔ)結(jié)構(gòu)。比如容量,擴(kuò)容個(gè),沒(méi)有意義,很快就滿了容量,擴(kuò)充個(gè),太多了,容易早證浪費(fèi)。 數(shù)據(jù)結(jié)構(gòu)-數(shù)組 數(shù)組 數(shù)據(jù)結(jié)構(gòu)中最基本的一個(gè)結(jié)構(gòu)就是線性結(jié)構(gòu),而線性結(jié)構(gòu)又分為連續(xù)存儲(chǔ)結(jié)構(gòu)和離散存儲(chǔ)結(jié)構(gòu)。所謂的連續(xù)存儲(chǔ)結(jié)構(gòu)其實(shí)就是數(shù)組。 優(yōu)點(diǎn):插入塊如果知道坐標(biāo)可以快速去地存取 缺點(diǎn):查找慢,刪除慢,大...

    894974231 評(píng)論0 收藏0
  • HashedWheelTimer算法詳解

    摘要:算法序和年的論文提出了一種定時(shí)輪的方式來(lái)管理和維護(hù)大量的調(diào)度算法內(nèi)核中的定時(shí)器采用的就是這個(gè)方案。使用實(shí)例每一次的時(shí)間間隔每一次就會(huì)到達(dá)下一個(gè)槽位輪中的數(shù)源碼解讀之時(shí)間輪算法實(shí)現(xiàn)定時(shí)輪算法細(xì)說(shuō)延時(shí)任務(wù)的處理定時(shí)器的實(shí)現(xiàn) HashedWheelTimer算法 序 George Varghese 和 Tony Lauck 1996 年的論文:Hashed and Hierarchical ...

    aervon 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<