Java 如何从链接列表中删除节点
嘿,伙计们,我写了这个deleteNode()方法,如果我使用数字(int),它可以工作,但是当我尝试传递字符串时,它就不能工作。我正在打印一个字符串[]名称列表,并试图从列表中删除某个名称。当我输入名称时,它会打印“未找到节点”。就像我说的,如果我打印出一个数字列表,效果会很好,但是如果我改成打印一个字符串,效果就不好了。感谢您的帮助Java 如何从链接列表中删除节点,java,eclipse,linked-list,nodes,Java,Eclipse,Linked List,Nodes,嘿,伙计们,我写了这个deleteNode()方法,如果我使用数字(int),它可以工作,但是当我尝试传递字符串时,它就不能工作。我正在打印一个字符串[]名称列表,并试图从列表中删除某个名称。当我输入名称时,它会打印“未找到节点”。就像我说的,如果我打印出一个数字列表,效果会很好,但是如果我改成打印一个字符串,效果就不好了。感谢您的帮助 public class BigNode { public String dataitems; public BigNode next
public class BigNode {
public String dataitems;
public BigNode next;
BigNode front ;
public void initList(){
front = null;
}
public BigNode makeNode(String number){
BigNode newNode;
newNode = new BigNode();
newNode.dataitems = number;
newNode.next = null;
return newNode;
}
public boolean isListEmpty(BigNode front){
boolean balance;
if (front == null){
balance = true;
}
else {
balance = false;
}
return balance;
}
public BigNode findTail(BigNode front) {
BigNode current;
current = front;
while(current.next != null){
//System.out.print(current.dataitems);
current = current.next;
} //System.out.println(current.dataitems);
return current;
}
public void addNode(BigNode front ,String number){
BigNode tail;
if(isListEmpty(front)){
this.front = makeNode(number);
}
else {
tail = findTail(front);
tail.next = makeNode(number);
}
}
public void deleteNode(BigNode front, String value) {
BigNode curr, previous = null; boolean found;
if (!isListEmpty(front)){
curr = front;
found = false;
while ((curr.next != null) && (!found)) {
if(curr.dataitems.equals(value)) {
found = true;
}
else {
previous = curr;
curr = curr.next;
}
}
if (!found) {
if(curr.dataitems.equals(value)) {
found = true;
}
}
if (found) {
if (curr.dataitems.equals(front.dataitems)){ // front.dataitems may be wrong .dataitems
front = curr.next;
} else {
previous.next = curr.next;
}
} else {
System.out.println("Node not found!");
//curr.next = null; // Not sure If this is needed
}
}
showList(front);
}
public void printNodes(String[] len){
int j;
for (j = 0; j < len.length; j++){
addNode(front, len[j]);
} showList(front);
}
public void showList(BigNode front){
BigNode current;
current = front;
while ( current.next != null){
System.out.print(current.dataitems + ", ");
current = current.next;
}
System.out.println(current.dataitems);
}
public static void main(String[] args) {
String[] names = {"Billy Joe", "Sally Mae", "Joe Blow", "Tasha Blue"};
BigNode x = new BigNode();
x.printNodes(names);
Scanner in = new Scanner(System.in);
String delete = in.next();
x.deleteNode(x.front, delete);
}
公共类BigNode{
公共字符串数据项;
公共大节点下一步;
大节点锋;
public void initList(){
front=null;
}
公共BigNode makeNode(字符串编号){
大节点新节点;
newNode=newbignode();
newNode.dataitems=编号;
newNode.next=null;
返回newNode;
}
公共布尔值isListEmpty(BigNode前端){
布尔平衡;
if(front==null){
平衡=正确;
}
否则{
平衡=假;
}
收益余额;
}
公共BigNode findTail(BigNode前端){
大节点电流;
电流=前沿;
while(current.next!=null){
//系统输出打印(当前数据项);
当前=当前。下一步;
}//System.out.println(current.dataitems);
回流;
}
public void addNode(BigNode前面,字符串编号){
大节尾;
如果(isListEmpty(前)){
this.front=makeNode(编号);
}
否则{
尾部=尾翼(前部);
tail.next=makeNode(编号);
}
}
公共void deleteNode(BigNode前端,字符串值){
BigNode curr,previous=null;找到布尔值;
如果(!isListEmpty(前)){
curr=正面;
发现=错误;
while((curr.next!=null)&&(!found)){
if(当前数据项等于(值)){
发现=真;
}
否则{
先前=当前;
curr=curr.next;
}
}
如果(!找到){
if(当前数据项等于(值)){
发现=真;
}
}
如果(找到){
如果(curr.dataitems.equals(front.dataitems)){//front.dataitems可能错误。dataitems
前=当前下一个;
}否则{
previous.next=curr.next;
}
}否则{
System.out.println(“未找到节点!”);
//curr.next=null;//不确定是否需要
}
}
展示名单(前);
}
公共void打印节点(字符串[]len){
int j;
对于(j=0;j
字符串[]名称={name1,name2,name3,name4}
-首先它打印列表,然后询问要删除的名称。您应该始终使用equals()来比较对象值,而不是==。例如,在代码中,这一行:
curr.dataitems == value
应写为:
curr.dataitems.equals(value)
您应该始终使用equals()来比较对象值,而不是==。例如,在代码中,这一行:
curr.dataitems == value
应写为:
curr.dataitems.equals(value)
编辑:好的,我已经发现你发布的示例代码有什么问题 您正在调用Scanner.next(),它读取一个单词。您所有的节点值都是两个单词。因此,如果我键入“Sally Mae”,它实际上只是在查找“Sally” 这与
BigNode
中的大多数代码无关(尽管这肯定会变得更加优雅)。基本上:
String delete = in.next();
应该是
String delete = in.nextLine();
现在,我强烈建议您不要只是更改代码,而是想想您可以自己诊断的方法:
- 在代码中添加日志记录,以显示您正在寻找的值,以及测试时的每个值
- 使用调试器单步执行代码,观察变量
- 使用单元测试来测试代码——这些测试不会向您显示问题(因为它不在您通常编写测试的代码中),但它们会让您更加确信问题不在测试的代码中
Scanner
在不同的地方,您使用==运算符来比较字符串引用。只有当您传入对列表中实际字符串对象之一的引用,而不是对相等字符串对象的引用时,才会找到节点 你想要的是:
if (curr.dataitems.equals(value))
(但要仔细检查
null
)编辑:好的,我发现了您发布的示例代码的错误
您正在调用Scanner.next(),它读取一个单词。您所有的节点值都是两个单词。因此,如果我键入“Sally Mae”,它实际上只是在查找“Sally”
这与BigNode
中的大多数代码无关(尽管这肯定会变得更加优雅)。基本上:
String delete = in.next();
应该是
String delete = in.nextLine();