You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LinkedBag元素添加原理及Node构造器作用咨询(Java)

Java LinkedBag实现疑问解析

我正在学习Java的LinkedBag实现,需明确以下问题以完成removeAllOccurrences方法的开发:

  • 当String数组contentsOfBag的元素添加到csc220Bag时,是否每个元素对应一个Node,且Node的next指向存储后续元素的Node?请纠正我的理解偏差。
  • LinkedBag内部类Node的两个私有构造器Node(T dataPortion)和Node(T dataPortion, Node nextNode)的设计目的是什么?

驱动代码

public class LinkedBagCSC220JavaDriver {

public static void main(String[] args) {
    System.out.println("=== LINKED BAG 220 JAVA ==========================================================");
    System.out.println("[+] Creating a CSC220 LinkedBag...");
    PrimaryDataStructureBagInterface<String> csc220Bag = new LinkedBag<>();
    testAdd(csc220Bag);
    testRemoveAllOccurrences(csc220Bag);
    System.out.println("=== LINKED BAG 220 JAVA ==========================================================");
}

private static void displayBag(PrimaryDataStructureBagInterface<String> aBag) {
    System.out.print("[>] The bag now contains " + aBag.getCurrentSize() + " string(s): \t");
    Object[] bagArray = aBag.toArray();
    for (Object bagArray1 : bagArray) {
        System.out.print(bagArray1 + " ");
    }
    System.out.println();
}

private static void testRemoveAllOccurrences(PrimaryDataStructureBagInterface<String> aBag) {
    // Removing all occurrences of the given entries from a bag
    System.out.println("[+] Creating... a 2D test array with the below contents: \t");
    String[][] testArray = {
            { "A", "A", "A", "A", "A", "A" },
            { "B", "A", "Bb", "B", "Bb", "B" },
            { "C", "B", "_", "A" },
            { "n", "u", "l", "l" }
    };

    for (String[] row : testArray) {
        System.out.print("\t\t\t\t\t");
        for (String col : row) {
            System.out.print(col + " ");
        }
        System.out.println("");
    }

    aBag.removeAllOccurrences(testArray);
    displayBag(aBag);
}

private static void testAdd(PrimaryDataStructureBagInterface<String> aBag) {
    // Adding strings
    String[] contentsOfBag = {
            "A", "_", "_", "G", "Bb", "A", "_", "u", "n",
            "o", "A", "o", "d", "Bb", "A", "A", "l", "l"
    };
    System.out.print("[+] Adding.... these items to the bag: \t");
    for (String entry : contentsOfBag) {
        aBag.add(entry); // trying to understand behind the scene of this line
        System.out.print(entry + " ");
    }
    System.out.println();

    displayBag(aBag);
}
}

LinkedBag类

public final class LinkedBag<T> implements PrimaryDataStructureBagInterface<T> {

private Node firstNode;
private int numberOfEntries;

public LinkedBag() {
    firstNode = null;
    numberOfEntries = 0;
}

@Override
public boolean removeAllOccurrences(T[][] entries) {
}

private class Node {
    private T data;
    private Node next;

    private Node(T dataPortion) {
        this(dataPortion, null);
    } // end constructor

    private Node(T dataPortion, Node nextNode) {
        data = dataPortion;
        next = nextNode;
    }
}
}

接口类PrimaryDataStructureBagInterface

public interface PrimaryDataStructureBagInterface<T> {

public int getCurrentSize();

public boolean isEmpty();

public boolean add(T newEntry);

public boolean removeAllOccurrences(T[][] entries);

public T[] toArray();
}

问题解答

  1. 关于元素与Node的对应关系
    你的理解核心是对的——每个元素都会对应一个独立的Node实例来存储数据。不过需要纠正一点:链表添加元素通常用头插法(Bag是无序集合,头插效率更高),新元素的Node的next指向的是当前链表的表头(也就是之前的firstNode),然后firstNode会更新为这个新Node。举个例子:先添加"A",此时firstNode指向存储"A"的Node;再添加"_",新Node的next指向"A"的Node,firstNode变成这个新Node。也就是说,后续添加的元素会成为链表的新表头,而不是"当前Node的next指向后续添加的元素"。

  2. 关于Node的两个私有构造器
    这两个构造器是为了适配不同的节点创建场景,同时实现代码复用:

  • Node(T dataPortion):是简化版构造器,用于创建没有后继节点的孤立节点,它内部直接调用了另一个构造器并传入null作为nextNode。当你只需要创建一个不连接到其他节点的节点时(比如链表初始添加元素,或者作为临时节点),用这个构造器更简洁。
  • Node(T dataPortion, Node nextNode):是基础核心构造器,允许在创建节点时直接指定它的后继节点。比如头插法添加元素时,你可以直接把当前的firstNode作为nextNode传入,一步完成节点初始化和链表连接,不需要额外设置next属性,代码更高效简洁。

内容的提问来源于stack exchange,提问作者JaRek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 22:01:37