您好,歡迎來到賦能網(wǎng)!

java沒有指針怎么實現(xiàn)鏈表?

賦能網(wǎng) 2023-05-09 54

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

如果本頁不是您要找的課程,您也可以百度查找一下: