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();
}