java是一種高級語言,它能夠?qū)崿F(xiàn)很多中軟件,有了java能夠給大家的生活帶來更多的便利,那java沒有指針怎么實現(xiàn)鏈表?接下來我們就來給大家講解一下這方面的內(nèi)容。
Java語言中的對象引用實際上是一個指針(這里的指針均為概念上的意義,而非語言提供的數(shù)據(jù)類型),所以我們可以編寫這樣的類來實現(xiàn)鏈表中的結(jié)點。
程序代碼:
class Node { Object data; Node next; //指向下一個結(jié)點 }
將數(shù)據(jù)域定義成Object類是因為Object類是廣義超類,任何類對象都可以給其賦值,增加了代碼的通用性。為了使鏈表可以被訪問還需要定義一個表頭,表頭必須包含指向第一個結(jié)點的指針和指向當前結(jié)點的指針。為了便于在鏈表尾部增加結(jié)點,還可以增加一指向鏈表尾部的指針,另外還可以用一個域來表示鏈表的大小,當調(diào)用者想得到鏈表的大小時,不必遍歷整個鏈表。
鏈表的數(shù)據(jù)結(jié)構(gòu)我們可以用類List來實現(xiàn)鏈表結(jié)構(gòu),用變量Head、Tail、Length、Pointer來實現(xiàn)表頭。存儲當前結(jié)點的指針時有一定的技巧,Pointer并非存儲指向當前結(jié)點的指針,而是存儲指向它的前趨結(jié)點的指針,當其值為null時表示當前結(jié)點是第一個結(jié)點,因為當刪除當前結(jié)點后仍需保證剩下的結(jié)點構(gòu)成鏈表,如果Pointer指向當前結(jié)點,則會給操作帶來很大困難。
如何得到當前結(jié)點呢?我們定義了一個方法cursor(),返回值是指向當前結(jié)點的指針。類List還定義了一些方法來實現(xiàn)對鏈表的基本操作,通過運用這些基本操作我們可以對鏈表進行各種操作。例如reset()方法使第一個結(jié)點成為當前結(jié)點。insert(Object d)方法在當前結(jié)點前插入一個結(jié)點,并使其成為當前結(jié)點。remove()方法刪除當前結(jié)點同時返回其內(nèi)容,并使其后繼結(jié)點成為當前結(jié)點,如果刪除的是最后一個結(jié)點,則第一個結(jié)點變?yōu)楫斍敖Y(jié)點。
鏈表類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; } }
當然,雙向鏈表基本操作的實現(xiàn)略有不同。鏈表和雙向鏈表的實現(xiàn)方法,也可以用在堆棧和隊列的實現(xiàn)中,最后大家如果想要了解更多java初識知識,敬請關(guān)注賦能網(wǎng)。
本文鏈接:
本文章“java沒有指針怎么實現(xiàn)鏈表?”已幫助 54 人
免責聲明:本信息由用戶發(fā)布,本站不承擔本信息引起的任何交易及知識產(chǎn)權(quán)侵權(quán)的法律責任!
本文由賦能網(wǎng) 整理發(fā)布。了解更多培訓機構(gòu)》培訓課程》學習資訊》課程優(yōu)惠》課程開班》學校地址等機構(gòu)信息,可以留下您的聯(lián)系方式,讓課程老師跟你詳細解答:
咨詢熱線:4008-569-579