重写LinkedList的addAll方法

Rewriting LinkedList addAll method

在学校,我正在做一个重写 LinkedList 的项目。我的 class 是一个名为 StringLinkedList 的单向链表(目前只能容纳字符串)。我正在编写 addAll 方法,但我的代码有问题。它适用于列表的开头和结尾,但我不明白为什么它在插入列表中间时不起作用

这里是方法和相关方法

    public boolean addAll( int index, StringLinkedList strLis ) {
        if (index < 0 || index > size) {
            throw new IndexOutOfBoundsException();
        }

        if (strLis.size == 0) {
            return false;
        }
        
        if (this.size() == 0) {
            head = strLis.head;
        }
        else if (index == 0) {
            strLis.nodeGet(size - 1).next = head;
            head = strLis.head;
        }
        else if (index == size) {
            nodeGet(size - 1).next = strLis.head;
        }
        else {
            Node prev = nodeGet(index - 1);
            Node succ = prev.next;
            
            prev.next = strLis.head;
            strLis.nodeGet(size - 1).next = succ;
        }
        
        size += strLis.size();
        
        return true;
    }

这是我的节点 class(嵌入在 StringLinkedList class)

class Node {
        private Object data;
        private Node next;

        /**
         * This builds a Node instance
         * This instance of Node will initially contain 
         * the data passed via the parameter
         * and have the pointer to the next node set to null
         * @param data data that will be held in the node
         */
        public Node(Object data) {
            this(data, null);
        }

        /**
         * This builds a Node instance
         * This instance of Node will initially contain 
         * the data passed via the parameter
         * and have the pointer to the next node set to the Node parameter
         * @param data data to be held in node
         * @param next reference to next node in list
         */
        public Node(Object data, Node next) {
            this.data = data;
            this.next = next;
        }
    }

这是我的 nodeGet 方法

private Node nodeGet(int index) {
        if (index < 0 || index >= size) {
            throw new IndexOutOfBoundsException();
        }
        Node temp = head;

        for (int i = 0; i < index; i++) {
            temp = temp.next;
        }

        return temp;
    }

此外,我知道我只是将引用复制到 .next 字段中,您通常不应该这样做。通常您会在将新节点添加到列表时实例化它。我的老师说这对于项目的功能来说不是必需的。

something is wrong with my code

考虑包括失败的测试用例和生成的错误消息,而不是上面的。

这一行有一个错误:

strLis.nodeGet(size - 1).next = succ;

size 保存源列表的大小而不是 strLis 的大小。将其替换为:

strLis.nodeGet(strLis.size() - 1).next = succ;

假设 StringLinkedList 有一个 size() 方法,如果不存在的话应该很容易添加。

而且至少应该能解决你的问题。同样,确保代码正常工作的唯一方法是尽可能多地投入边缘测试用例。