国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

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

宋華 / 950人閱讀

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

線性表和鏈表

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

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

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

  

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

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

下面是雙向鏈表的實(shí)現(xiàn)過程,包括鏈表類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ù)類型為Object,可以通過多態(tà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)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/64206.html

相關(guān)文章

  • Java? 教程(嵌套類)

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

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

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

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

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

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

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

    894974231 評論0 收藏0
  • HashedWheelTimer算法詳解

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

    aervon 評論0 收藏0

發(fā)表評論

0條評論

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