LinkedList中的添加方法无效

时间:2017-03-14 05:04:34

标签: java linked-list nodes singly-linked-list

我正在将此作为我的Java课程的额外练习,但我似乎无法理解为什么我的添加方法无法正常工作。我已尝试逐行使用调试器遍历代码,但我无法查看它出错的地方。这显然是一个逻辑错误。当我测试add方法时,它似乎工作但它没有正确地链接节点,或者不存储数据。

所以赋值是写一个链表(不添加重复项)。我将Node类作为LinkedSet类的内部函数。我们的教科书建议针对这一特定任务。 这是我使用的添加方法。

public class LinkedSet <T> implements SetInterface <T> {    
        private Node firstNode;
        private int numberOfEntries;


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

    public boolean add(T newEntry){
                boolean result = false;
                Node aNewNode = new Node (newEntry);

                //If Node is currently null then add data to front
                if(firstNode == null)
                    firstNode = aNewNode;
                else
                {
                    //Add newEntry if it's not already stored.
                    if(!contains(newEntry) && numberOfEntries != 0)
                    {
                        aNewNode.next = firstNode;
                        firstNode.next = aNewNode;
                        firstNode = aNewNode;

                        result = true;
                    }
                    else
                        result = false;
                }

                return result;      
            }//End add

        public boolean contains(T anEntry){
                boolean found = false;

                while (!found && (firstNode != null))
                {
                    if(anEntry.equals(firstNode.getData()))
                        found = true;
                    else 
                        firstNode = firstNode.getNextNode();
                }

                return found;
            }
    private class Node {

            private T data;
            private Node next;

            private Node (T theData){
                data = theData;
                next = null;
            }

            private Node(T theData, Node nextNode){
                data = theData;
                next = nextNode; 
            }
    } //End Node class
}End LinkedSet

此外,这是添加的测试方法(需要编写单独的测试应用程序并在单独的主类中完成)

private static boolean testAdd(SetInterface<String> aSet, String[] contentsToAdd){

        boolean result = false;

        for (int index = 0; index < contentsToAdd.length; index++)
        {
            aSet.add(contentsToAdd[index]);
            result = true;
        }

        return result;
    }//End testAdd

还有一些其他的方法,但在我可以使用add方法之前,我不能对它们做很多事情,所以我很确定这个问题就在这里。 我在类似的问题上环顾网络,但我仍然无法看到它在哪里。感谢任何帮助,我现在已经把它弄得太久了。

3 个答案:

答案 0 :(得分:2)

if(firstNode == null)
    firstNode = aNewNode;

在这种情况下,您应该返回true

if(!contains(newEntry) && numberOfEntries != 0)

这个测试没有多大意义。反过来会更有意义:

if(numberOfEntries != 0 && !contains(newEntry))

因为如果没有条目,调用contains()是没有意义的,但是contains()已经知道无论如何,firstNode如果numberOfEntries为零则为空,所以它应该只是

if (!contains(newEntry))

注意:您没有维护numberOfEntries

答案 1 :(得分:1)

我没有彻底阅读你的所有代码,但这里有一个错误:

if(firstNode == null)
        firstNode = aNewNode;

它应该增加numberOfEntries

因为numberOfEntries始终为零且添加无法正常工作

同样,您也不会在numberOfEntries中维护else

答案 2 :(得分:0)

包含方法也有问题,您正在更改firstNode引用,您不应该更改

public boolean contains(T anEntry){
                boolean found = false;
                Node ptr = firstNode;
                while (!found && (ptr != null))
                {
                    if(anEntry.equals(ptr.getData()))
                        found = true;
                    else 
                        ptr = ptr.getNextNode();
                }

                return found;
            }