链接列表 - 单个对象如何一个接一个地存储这么多地址?

时间:2018-02-25 13:42:11

标签: java data-structures linked-list

我了解数据结构和链接列表,我不了解某些内容。单个对象如何存储这么多地址和数据。当我了解对象时,我发现如果要为单个变量存储许多数据,则需要创建新对象,但现在在Linked List中,newNode对象将存储data1,next1,data2,next2,.... datan ,旁边。

当程序运行list.insert(11)并且数据变为11时,为什么不删除5的旧数据?

对不起我的英语语法,任何反馈都会被贬低。谢谢!

以下代码是关于在链接列表中插入的节点:

节点类

public class Node {

    int data;
    Node next;

    public int getData() {

        return data;
    }

    public Node getNext() {

        return next;
    }

    public void setData(int data) {

        this.data = data;
    }

    public void setNext(Node next) {

        this.next = next;
    }

}

MyLinkedList类:

public class MyLinkedList {

    Node head;

    public void insert(int data) {

        Node newNode = new Node();
        newNode.setData(data); 
        newNode.setNext(null);

        if (head == null) {

            head = newNode;
        }
        else {

            Node n = head;
            while(n.getNext() != null) {

                n = n.getNext();
            }

            n.setNext(newNode);
        }
    }

    public void show() {

        Node newNode = head;
        while (newNode.getNext() != null) {

            System.out.println(newNode.getData());
            newNode = newNode.getNext();
        }

        System.out.println(newNode.getData());
    }

}

Runnner课程:

public class Runner {

    public static void main(String args[]) {

        MyLinkedList list = new MyLinkedList();

        list.insert(5);
        list.insert(11);
        list.insert(9);
        list.insert(3);
        list.show();
    }

}

2 个答案:

答案 0 :(得分:1)

链表本身几乎不知道它包含的数据。它通常只包含总大小的变量和第一个节点的引用, head (以及双链表中的尾部)。

节点是一个自己的对象,它包含数据变量和对下一个节点的引用,它也是一个自己的对象,依此类推。 (在双向链表中,节点也有指向前一节点的指针)

enter image description here

因此,为了访问第五个节点,您需要从头开始并按照下一个指针直到第五个节点。链表中没有直接访问权限。但是,它允许通过重新排列节点的下一个指针来轻松插入或删除元素,例如跳过节点。

enter image description here

另外,请注意,一个对象可容纳多少数据无限制。您完全可以在一个对象中同时保存所有数据。对象的变量也只是对存储实际数据的位置的引用。所以它不需要在内存中彼此相邻,它可以散布在各地。

相反,数组的所有数据都连接在内存中。这就是直接访问适用于数组的原因。你有数组开始的基地址,知道元素的字节大小,并且可以通过它轻松计算内存数据中哪个元素开始的位置:

// Memory address of fifth element of an int[] array
base + 4 * sizeof(int)

这也是他们需要固定尺寸的原因。

答案 1 :(得分:-1)

您的Node类包含数据(int)和对另一个(下一个)Node对象的引用,该对象也将保存数据值。链表类用于构建一个集合,其中每个数据项使用Node类与另一个数据项链接在一起,以便每个数据项单独存储。

如果您只想用新数据更新第一个Node对象,那么您的代码将类似于

Node node = new Node()
node.setData(5)
node.setData(11)
...