在java中在单链表中追加唯一值

在java中在单链表中追加唯一值,java,linked-list,Java,Linked List,我想在不重复值的情况下附加到链表中。这是我的功能:但这并不能过滤掉重复项。知道我哪里出错了吗?节点由字符串值和下一个指针组成 public static void append( Node head, Node newNode ) { Node currentNode = head; while( currentNode.next != null ) { if(currentNode.value.trim().equals(newNode.value.trim(

我想在不重复值的情况下附加到链表中。这是我的功能:但这并不能过滤掉重复项。知道我哪里出错了吗?节点由字符串值和下一个指针组成

public static void append( Node head, Node newNode ) {  
   Node currentNode = head;  
   while( currentNode.next != null ) { 
      if(currentNode.value.trim().equals(newNode.value.trim())) {
         return;
      }
      currentNode = currentNode.next;
   }  
   currentNode.next = newNode; 
}

您永远不会检查最后一个节点是否存在重复


将来发现类似问题的最佳方法是在调试器中逐步检查代码,而不是在论坛上提问。否则,您将永远无法学会自己编写代码。

您永远不会检查最后一个节点是否存在重复


将来发现类似问题的最佳方法是在调试器中逐步检查代码,而不是在论坛上提问。否则,您将永远无法学会自己编写代码。

您没有检查最后一个节点是否存在重复(正如jtahlborn在回答中所说的,在我开始编写本文时删除了该节点…)。您需要一直运行,直到
currentNode
为空,但还需要记住上一个节点,以便将其用作尾部节点

这里有一个简短但完整的程序显示它的工作原理。它有讨厌的包访问字段等,但它的工作

class Test {
    public static void main(String[] args) {
        Node head = new Node("head");
        append(head, new Node("foo"));
        append(head, new Node("bar"));
        append(head, new Node("bar"));
        append(head, new Node("bar"));
        append(head, new Node("baz"));
        dump(head);
    }        

    public static void append(Node head, Node newNode) {
        Node currentNode = head;
        Node previousNode = null;

        while (currentNode != null) {
            previousNode = currentNode;
            if (currentNode.value.trim().equals(newNode.value.trim())) {
                return;
            }
            currentNode = currentNode.next;
        } 

        previousNode.next = newNode;        
    }

    public static void dump(Node head) {
        Node currentNode = head;

        while (currentNode != null) {
            System.out.println(currentNode.value);
            currentNode = currentNode.next;
        } 
    }
}

class Node {
    String value;
    Node next;

    Node(String value) {
        this.value = value;
    }
}

您没有检查最后一个节点是否存在重复(正如jtahlborn在回答中所说的,在我开始编写本文时删除了…)。您需要一直运行,直到
currentNode
为空,但还需要记住上一个节点,以便将其用作尾部节点

这里有一个简短但完整的程序显示它的工作原理。它有讨厌的包访问字段等,但它的工作

class Test {
    public static void main(String[] args) {
        Node head = new Node("head");
        append(head, new Node("foo"));
        append(head, new Node("bar"));
        append(head, new Node("bar"));
        append(head, new Node("bar"));
        append(head, new Node("baz"));
        dump(head);
    }        

    public static void append(Node head, Node newNode) {
        Node currentNode = head;
        Node previousNode = null;

        while (currentNode != null) {
            previousNode = currentNode;
            if (currentNode.value.trim().equals(newNode.value.trim())) {
                return;
            }
            currentNode = currentNode.next;
        } 

        previousNode.next = newNode;        
    }

    public static void dump(Node head) {
        Node currentNode = head;

        while (currentNode != null) {
            System.out.println(currentNode.value);
            currentNode = currentNode.next;
        } 
    }
}

class Node {
    String value;
    Node next;

    Node(String value) {
        this.value = value;
    }
}

你能发布一个简短但完整的程序来演示问题吗?你能发布一个简短但完整的程序来演示问题吗?这可能是一个门槛问题,但为什么不在current=newNode的末尾添加呢?@dreamcrash:你为什么希望这会有所帮助?更改局部变量
currentNode
的值不会更改尾部的
下一个
节点…@dreamcrash:No,因为仅更改
currentNode
的值不会产生任何效果。如果你的意思是我为什么不使用
currentNode.next=newNode
,那是因为它将是空的。谢谢你的解释,我更习惯于使用递归的c中的链表。我认为,因为currentNode=head;currentNode指向原始链表的相同内存地址。因此,更改currentNode也会引起注意。这可能是一个门槛问题,但为什么不在current=newNode的末尾添加呢?@dreamcrash:你为什么希望这会有所帮助?更改局部变量
currentNode
的值不会更改尾部的
下一个
节点…@dreamcrash:No,因为仅更改
currentNode
的值不会产生任何效果。如果你的意思是我为什么不使用
currentNode.next=newNode
,那是因为它将是空的。谢谢你的解释,我更习惯于使用递归的c中的链表。我认为,因为currentNode=head;currentNode指向原始链表的相同内存地址。所以更改currentNode也会引起注意。