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

java沒(méi)有指針怎么實(shí)現(xiàn)鏈表?

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

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

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