Java 从“LinkedList”中删除指定的“Link”`
各位,我在从Java 从“LinkedList”中删除指定的“Link”`,java,linked-list,nodes,Java,Linked List,Nodes,各位,我在从链接列表中删除指定的链接时遇到问题。例如,如果我有: "A" --> "B" --> "C" 并且要删除一个链接“B”,因此结果将是: "A" --> "C" 我在如何获取上一个链接“A”和对“C”的引用方面遇到了问题。有人能帮我吗?方法是: public void delete(String data){ if(isEmpty()){ System.out.println("The list is empty!");
链接列表
中删除指定的链接时遇到问题。例如,如果我有:
"A" --> "B" --> "C"
并且要删除一个链接
“B”
,因此结果将是:
"A" --> "C"
我在如何获取上一个链接“A”
和对“C”
的引用方面遇到了问题。有人能帮我吗?方法是:
public void delete(String data){
if(isEmpty()){
System.out.println("The list is empty!");
System.exit(0);
}
else{
Link current = firstLink;
Link previous = firstLink;
while(current != null){
if(current.getData().equals(data)){
previous = current.getNext();
}
else{
previous = current;
current = current.getNext();
}
}
}
}
类链接
package LinkedList;
public class Link{
private String data;
private Link next;
public Link(String data){
this.data = data;
}
public void display(){
System.out.println(data);
}
public String getData(){
return this.data;
}
public Link getNext(){
return this.next;
}
}
class LinkedList{
private Link firstLink;
public LinkedList(){
this.firstLink = null;
}
public boolean isEmpty(){
return (this.firstLink == null);
}
public void insert(String data){
Link newLink = new Link(data);
Link newLinkNext = newLink.getNext();
newLinkNext = firstLink;
firstLink = newLink;
}
public Link deleteFirst(){
if(isEmpty()){
return null;
}
else {
Link deletedOne = this.firstLink;
Link nextLink = firstLink.getNext();
firstLink = nextLink;
return deletedOne;
}
}
public void delete(String data){
if(isEmpty()){
System.out.println("The list is empty!");
System.exit(0);
}
else{
Link current = firstLink;
Link previous = firstLink;
while(current != null){
if(current.getData().equals(data)){
previous = current.getNext();
}
else{
previous = current;
current = current.getNext();
}
}
}
}
伪代码:
prev = null;
current = first;
while not at the end of the list
{
if (current.data == the object I want) {
if (prev == null) {
first = current.next
break
}
prev.next = current.next
break;
}
prev = current
current = current.next
}
迭代列表时,不能在列表中操作(添加、删除…项)。您必须使用迭代器
for(Iterator<EmpDedup> iter = list.iterator(); iter.hasNext();) {
EmpDedup data = iter.next();
if (data.getRecord() == rec1) {
iter.remove();
}
}
for(迭代器iter=list.Iterator();iter.hasNext();){
EMPDead data=iter.next();
if(data.getRecord()==rec1){
iter.remove();
}
}
请参见这是一个试图使其与您的代码相似的示例
public class LinkedList {
private Node firstNode = null;
public LinkedList() {
}
public Node getFirstNode() {
return firstNode;
}
public void setFirstNode(Node firstNode) {
this.firstNode = firstNode;
}
public void addNode(Node node) {
if(firstNode == null){
firstNode = node;
}else{
Node walker = firstNode;
while(walker.getNext() != null)
walker = walker.getNext();
walker.setNext(node);
}
}
public void delete(int value) {
if (firstNode != null) {
Node walker = firstNode;
if (walker.getValue() == value) {
if(walker.getNext()!=null){
firstNode = walker.getNext();
}else{
setFirstNode(null);
}
} else {
Node previous = walker;
while (walker.getNext() != null) {
previous = walker;
walker = walker.getNext();
if (walker.getValue() == value) {
previous.setNext(walker.getNext());
break;
}
}
}
} else {
System.out.println("Nothing to delete");
}
}
public void listValues (){
if(firstNode != null){
Node walker = firstNode;
while(walker.getNext() != null)
{
System.out.println(walker.getValue());
walker = walker.getNext();
}
}
}
}
公共类节点{
private Node next = null;
private int value;
public Node(Node node, int value) {
this.next = node;
this.value = value;
}
public Node getNext() {
return next;
}
public void setNext(Node node) {
this.next = node;
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
}
公共类模拟{
public static void main(String[] args) {
LinkedList list = new LinkedList();
list.addNode(new Node(null, 1));
list.addNode(new Node(null, 2));
list.addNode(new Node(null, 3));
list.addNode(new Node(null, 4));
list.addNode(new Node(null, 123));
list.addNode(new Node(null, 5));
list.addNode(new Node(null, 6));
list.listValues();
list.delete(1);
System.out.println("-----");
list.listValues();
list.delete(123);
System.out.println("-----");
list.listValues();
list.addNode(new Node(null, 123));
list.addNode(new Node(null, 5));
list.delete(2);
System.out.println("-----");
list.listValues();
list.delete(26);
System.out.println("-----");
list.listValues();
}
}
输出:12341235
2 3 4 123 5
2 3 4 5
3 4 5 6 123
3456123
关于我甚至没有看到任何将A连接到C的尝试。你需要知道B之前的节点,这样你就可以使B之前的节点指向B之后的节点。@John3136,这是我的问题,我应该如何获得“B”之前的节点
?你有一个循环,而循环-为什么不每次通过循环都记住以前的值?@John3136,我已经更新了代码。尚未测试但将在几秒钟内执行的操作应该是previous.next=current.getNext()
,而不是previous=current.getNext()
。可能应该检查一下是否current==firstLink
,并适当处理。问题@John3136,为什么有prev.next=current.next
?它将上一个节点设置为指向下一个节点(因此现在“current”不在列表中)。它在if
中,因此您只能在当前
节点是您要删除的节点时才执行此操作。但它仍然不起作用,@John3136。我已经尝试了你在这里给出的代码,然后你需要发布更多的细节——伪代码可以工作——用笔和纸来确认——这可能会帮助你发现你的问题。
public static void main(String[] args) {
LinkedList list = new LinkedList();
list.addNode(new Node(null, 1));
list.addNode(new Node(null, 2));
list.addNode(new Node(null, 3));
list.addNode(new Node(null, 4));
list.addNode(new Node(null, 123));
list.addNode(new Node(null, 5));
list.addNode(new Node(null, 6));
list.listValues();
list.delete(1);
System.out.println("-----");
list.listValues();
list.delete(123);
System.out.println("-----");
list.listValues();
list.addNode(new Node(null, 123));
list.addNode(new Node(null, 5));
list.delete(2);
System.out.println("-----");
list.listValues();
list.delete(26);
System.out.println("-----");
list.listValues();
}