摘要:雙向鏈表的實現,必須注意雙向鏈表的和兩個指針的正確指向,以及插入和刪除過程中指向操作增減的有序性。定義節點,節點數據類型為,可以通過多態方式具象化為其他類型定義從頭尾節點增加節點定義從頭尾節點刪除節點
線性表和鏈表
單向鏈表利用了類的自引用,實現了類似指針的效果。
雙向鏈表的實現,必須注意雙向鏈表的head和back兩個指針的正確指向,以及插入和刪除過程中指向操作增減的有序性。
下面幾圖從java面向對象的角度說明了單向雙向鏈表的邏輯結構,類的自引用使得邏輯指向成為可能。
以下兩圖說明了添加刪除頭尾節點時執行的順序:
添加頭結點時先加一個臨時節點,建立此臨時節點和原頭節點后使此臨時節點為新頭結點即可。
刪除尾節點時先使原次頭結點為新頭結點,然后刪除原頭節點和新頭結點的連接后,再刪除新頭結點和原頭結點的連接。
尾節點的處理方法類似。
這樣的刪除方法能夠完全釋放所有的占用空間。
下面是雙向鏈表的實現過程,包括鏈表類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 ///定義節點,節點數據類型為Object,可以通過多態方式具象化為其他類型 { 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; } ///////////////////////定義從頭尾節點增加節點 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; } } //////////////////////////定義從頭尾節點刪除節點 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(" "); } }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/64206.html
嵌套類 Java編程語言允許你在另一個類中定義類,這樣的類稱為嵌套類,如下所示: class OuterClass { ... class NestedClass { ... } } 術語:嵌套類分為兩類:靜態和非靜態,聲明為static的嵌套類稱為靜態嵌套類,非靜態嵌套類稱為內部類。 class OuterClass { ... stati...
摘要:堆棧可以看成是有特定規則為的線性表,特定規則就是先進后出,后進先出,可以看成是我們的先的要后,所以利用這一點可以通過繼承或組合的方式來構建堆棧。鑒于上面這張物理結構和邏輯結構,我們采用提供的來構建主存儲結構,即節點的線性表以達到索引的目的。 堆棧 可以看成是有特定規則為的線性表,特定規則就是先進后出,后進先出,可以看成是我們List的先insertFromHead的要后deleteF...
摘要:棧也稱為后進先出表棧的應用場景操作撤銷例如將操作的每組數據存入棧中,如果想要撤銷,只需要彈出棧頂元素,就可以恢復上一步操作了。最后執行完成,根據棧的結構開始彈出數據,一步一步再走回方法。 數據結構-棧 定義 棧(英語:stack)又稱為堆棧或堆疊,棧作為一種數據結構,它按照先進后出的原則存儲數據,先進入的數據被壓入棧底,最后的數據在棧頂,需要讀數據的時候從棧頂開始彈出數據(最后一個數據...
摘要:算法序和年的論文提出了一種定時輪的方式來管理和維護大量的調度算法內核中的定時器采用的就是這個方案。使用實例每一次的時間間隔每一次就會到達下一個槽位輪中的數源碼解讀之時間輪算法實現定時輪算法細說延時任務的處理定時器的實現 HashedWheelTimer算法 序 George Varghese 和 Tony Lauck 1996 年的論文:Hashed and Hierarchical ...
閱讀 3106·2021-11-18 10:02
閱讀 2618·2021-10-13 09:47
閱讀 3034·2021-09-22 15:07
閱讀 791·2019-08-30 15:43
閱讀 1810·2019-08-30 10:59
閱讀 1685·2019-08-29 15:34
閱讀 1702·2019-08-29 15:06
閱讀 439·2019-08-29 13:28