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(); }
问题解答
关于元素与Node的对应关系
你的理解核心是对的——每个元素都会对应一个独立的Node实例来存储数据。不过需要纠正一点:链表添加元素通常用头插法(Bag是无序集合,头插效率更高),新元素的Node的next指向的是当前链表的表头(也就是之前的firstNode),然后firstNode会更新为这个新Node。举个例子:先添加"A",此时firstNode指向存储"A"的Node;再添加"_",新Node的next指向"A"的Node,firstNode变成这个新Node。也就是说,后续添加的元素会成为链表的新表头,而不是"当前Node的next指向后续添加的元素"。关于Node的两个私有构造器
这两个构造器是为了适配不同的节点创建场景,同时实现代码复用:
Node(T dataPortion):是简化版构造器,用于创建没有后继节点的孤立节点,它内部直接调用了另一个构造器并传入null作为nextNode。当你只需要创建一个不连接到其他节点的节点时(比如链表初始添加元素,或者作为临时节点),用这个构造器更简洁。Node(T dataPortion, Node nextNode):是基础核心构造器,允许在创建节点时直接指定它的后继节点。比如头插法添加元素时,你可以直接把当前的firstNode作为nextNode传入,一步完成节点初始化和链表连接,不需要额外设置next属性,代码更高效简洁。
内容的提问来源于stack exchange,提问作者JaRek
相关产品推荐
相关产品推荐

