摘要:雙向鏈表的實(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
嵌套類(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...
摘要:堆??梢钥闯墒怯刑囟ㄒ?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...
摘要:棧也稱(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ù)...
摘要:數(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):查找慢,刪除慢,大...
摘要:算法序和年的論文提出了一種定時(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 ...
閱讀 3118·2021-11-18 10:02
閱讀 2627·2021-10-13 09:47
閱讀 3073·2021-09-22 15:07
閱讀 805·2019-08-30 15:43
閱讀 1821·2019-08-30 10:59
閱讀 1702·2019-08-29 15:34
閱讀 1713·2019-08-29 15:06
閱讀 453·2019-08-29 13:28