java是一種高級(jí)語(yǔ)言,它能夠?qū)崿F(xiàn)很多中軟件,有了java能夠給大家的生活帶來(lái)更多的便利,那java沒(méi)有指針怎么實(shí)現(xiàn)鏈表?接下來(lái)我們就來(lái)給大家講解一下這方面的內(nèi)容。
Java語(yǔ)言中的對(duì)象引用實(shí)際上是一個(gè)指針(這里的指針均為概念上的意義,而非語(yǔ)言提供的數(shù)據(jù)類(lèi)型),所以我們可以編寫(xiě)這樣的類(lèi)來(lái)實(shí)現(xiàn)鏈表中的結(jié)點(diǎn)。
程序代碼:
class Node { Object data; Node next; //指向下一個(gè)結(jié)點(diǎn) }
將數(shù)據(jù)域定義成Object類(lèi)是因?yàn)镺bject類(lèi)是廣義超類(lèi),任何類(lèi)對(duì)象都可以給其賦值,增加了代碼的通用性。為了使鏈表可以被訪問(wèn)還需要定義一個(gè)表頭,表頭必須包含指向第一個(gè)結(jié)點(diǎn)的指針和指向當(dāng)前結(jié)點(diǎn)的指針。為了便于在鏈表尾部增加結(jié)點(diǎn),還可以增加一指向鏈表尾部的指針,另外還可以用一個(gè)域來(lái)表示鏈表的大小,當(dāng)調(diào)用者想得到鏈表的大小時(shí),不必遍歷整個(gè)鏈表。
鏈表的數(shù)據(jù)結(jié)構(gòu)我們可以用類(lèi)List來(lái)實(shí)現(xiàn)鏈表結(jié)構(gòu),用變量Head、Tail、Length、Pointer來(lái)實(shí)現(xiàn)表頭。存儲(chǔ)當(dāng)前結(jié)點(diǎn)的指針時(shí)有一定的技巧,Pointer并非存儲(chǔ)指向當(dāng)前結(jié)點(diǎn)的指針,而是存儲(chǔ)指向它的前趨結(jié)點(diǎn)的指針,當(dāng)其值為null時(shí)表示當(dāng)前結(jié)點(diǎn)是第一個(gè)結(jié)點(diǎn),因?yàn)楫?dāng)刪除當(dāng)前結(jié)點(diǎn)后仍需保證剩下的結(jié)點(diǎn)構(gòu)成鏈表,如果Pointer指向當(dāng)前結(jié)點(diǎn),則會(huì)給操作帶來(lái)很大困難。
如何得到當(dāng)前結(jié)點(diǎn)呢?我們定義了一個(gè)方法cursor(),返回值是指向當(dāng)前結(jié)點(diǎn)的指針。類(lèi)List還定義了一些方法來(lái)實(shí)現(xiàn)對(duì)鏈表的基本操作,通過(guò)運(yùn)用這些基本操作我們可以對(duì)鏈表進(jìn)行各種操作。例如reset()方法使第一個(gè)結(jié)點(diǎn)成為當(dāng)前結(jié)點(diǎn)。insert(Object d)方法在當(dāng)前結(jié)點(diǎn)前插入一個(gè)結(jié)點(diǎn),并使其成為當(dāng)前結(jié)點(diǎn)。remove()方法刪除當(dāng)前結(jié)點(diǎn)同時(shí)返回其內(nèi)容,并使其后繼結(jié)點(diǎn)成為當(dāng)前結(jié)點(diǎn),如果刪除的是最后一個(gè)結(jié)點(diǎn),則第一個(gè)結(jié)點(diǎn)變?yōu)楫?dāng)前結(jié)點(diǎn)。
鏈表類(lèi)List的源代碼如下:
package cn.javatx; import java.io.IOException; public class List { private Node Head = null; private Node Tail = null; private Node Pointer = null; private int Length = 0; public void deleteAll() { Head = null; Tail = null; Pointer = null; Length = 0; } public void reset() { Pointer = null; } public boolean isEmpty() { return (Length == 0); } public boolean isEnd() { if (Length == 0) throw new java.lang.NullPointerException(); else if (Length == 1) return true; else return (cursor() == Tail); } public Object nextNode() { if (Length == 1) throw new java.util.NoSuchElementException(); else if (Length == 0) throw new java.lang.NullPointerException(); else { Node temp = cursor(); Pointer = temp; if (temp != Tail) return (temp.next.data); else throw new java.util.NoSuchElementException(); } } public Object currentNode() { Node temp = cursor(); return temp.data; } public void insert(Object d) { Node e = new Node(d); if (Length == 0) { Tail = e; Head = e; } else { Node temp = cursor(); e.next = temp; if (Pointer == null) Head = e; else Pointer.next = e; } Length++; } public int size() { return (Length); } public Object remove() { Object temp; if (Length == 0) throw new java.util.NoSuchElementException(); else if (Length == 1) { temp = Head.data; deleteAll(); } else { Node cur = cursor(); temp = cur.data; if (cur == Head) Head = cur.next; else if (cur == Tail) { Pointer.next = null; Tail = Pointer; reset(); } else Pointer.next = cur.next; Length--; } return temp; } private Node cursor() { if (Head == null) throw new java.lang.NullPointerException(); else if (Pointer == null) return Head; else return Pointer.next; } public static void main(String[] args) { List a = new List(); for (int i = 1; i <= 10; i++) a.insert(new Integer(i)); System.out.println(a.currentNode()); while (!a.isEnd()) System.out.println(a.nextNode()); a.reset(); while (!a.isEnd()) { a.remove(); } a.remove(); a.reset(); if (a.isEmpty()) System.out.println("There is no Node in List n"); System.out.println("You can press return to quitn"); try { System.in.read(); } catch (IOException e) {} } } class Node { Object data; Node next; Node(Object d) { data = d; next = null; } }
當(dāng)然,雙向鏈表基本操作的實(shí)現(xiàn)略有不同。鏈表和雙向鏈表的實(shí)現(xiàn)方法,也可以用在堆棧和隊(duì)列的實(shí)現(xiàn)中,最后大家如果想要了解更多java初識(shí)知識(shí),敬請(qǐng)關(guān)注賦能網(wǎng)。
本文鏈接:
本文章“java沒(méi)有指針怎么實(shí)現(xiàn)鏈表?”已幫助 54 人
免責(zé)聲明:本信息由用戶發(fā)布,本站不承擔(dān)本信息引起的任何交易及知識(shí)產(chǎn)權(quán)侵權(quán)的法律責(zé)任!
本文由賦能網(wǎng) 整理發(fā)布。了解更多培訓(xùn)機(jī)構(gòu)》培訓(xùn)課程》學(xué)習(xí)資訊》課程優(yōu)惠》課程開(kāi)班》學(xué)校地址等機(jī)構(gòu)信息,可以留下您的聯(lián)系方式,讓課程老師跟你詳細(xì)解答:
咨詢熱線:4008-569-579