在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也会引起注意。