java - 无法从双向链表中删除节点
问题描述
这是我正在尝试做的方法......即使存在要删除的名称,它也总是打印“Nothing to delete1”。
public String deleteName(String name){
Node current, previous;
String a ="";
current = start;
previous = null;
while(current != null && !current.getData().getName().equals(name) ){
current = current.getNext();
a = "Nothing to delete1";
}
if(current == null){
a = "Nothing to delete";
}
if(current.getData().equals(name)){
a = "name deleted";
current.setPrevious(current.getNext());
current.setNext(null);
}
return a;
}
解决方案
您的问题在于如何更新不同节点之间的链接以从链接列表中删除特定节点。
current.setPrevious(current.getNext());
上面的语句将节点的previous
链接设置current
为节点旁边的current
节点;这是不正确的。
上面的语句做了以下操作:
|next node| <--- |current node|
要删除current
节点,您需要:
设置
next
前一个节点的指向该节点旁边的current
节点current.getPrevious().setNext(current.getNext());
基本上,您想要执行以下操作:
|previous node| ---> |next node|
设置
previous
节点的,节点旁边的current
,指向节点之前的current
节点current.getNext().setPrevious(current.getPrevious());
在这里,您要执行以下操作:
|previous node| <--- |next node|
之后,您可以将节点的and设置previous
为next
current
null
current.setNext(null);
current.setPrevious(null);
我会重写你的方法,如下所示:
public String deleteName(String name){
String result = "";
Node current = start;
Node previous = null;
while(current != null && !current.getData().getName().equals(name)){
current = current.getNext();
}
if(current == null){
result = "Nothing to delete";
} else {
current.getPrevious().setNext(current.getNext());
current.getNext().setPrevious(current.getPrevious());
current.setNext(null);
current.setPrevious(null);
result = "name deleted";
}
return result;
}
推荐阅读
- sql - 在coldfusion中正确查询cfscript?
- python - 如何防止元素在kivy中过渡?
- php - 使用 Slack 斜杠命令找不到触发器 ID?
- spring - spring api项目中如何设计RabbitMQ实现?
- go - go 格式错误的导入路径空路径元素
- polymorphism - ocaml 多态性 - 强制类型符合多态类型
- python-3.x - 如何使用带有“utf-8”编码的“filedialog.askopenfile”打开文件。我可以打开文件,但它以不同的编码打开
- dynamics-crm - Dynamics CRM 2016 On-Prem 插件 - 异常:无法加载文件或程序集“Microsoft.IdentityModel.Clients.ActiveDirectory”
- node.js - Gatsby:在插件中执行之前在 graphql 查询中注入一个字段
- php - 此路由不支持 POST 方法。调用未定义的方法 Faker\Provider\Image::make()