双重链表 - 删除方法

时间:2012-03-06 12:27:10

标签: java doubly-linked-list

我也试图通过用户输入的索引删除双向链表中的节点。这似乎对我有意义,但在“删除节点”并重新打印列表的内容后,没有任何改变。我确定这是一件让我失踪的蠢事。有什么建议吗?

public void removeEntryNode() {
    System.out
            .println("We delete by index here. Type in the number you want to delete");
    // print list for selection
    temp = head;
    while (temp != null && temp.getFirstName() != null) {
        System.out.print(temp.getIndex() + " " + temp.getFirstName() + " ");
        System.out.print(temp.getLastName() + " ");
        System.out.println(" ");
        temp = temp.getNext();
    }

    int selection = keyboard.nextInt();

    // Gets node matching index with selection and deletes it
    // Next two lines loop through list
    while (temp != null && temp.getIndex() != selection) {
        temp = temp.getNext();
    }

    // if it is the head
    if (selection == 0) {
        head = temp.getNext();
        temp.getNext().setPrev(null);
        temp.setNext(null);
        counter--;
    }
    // if it is the tail
    else if (selection == size()) {
        tail = temp.getPrev();
        temp.setPrev(null);
        temp.setNext(null);
        temp.getPrev().setNext(null);
        counter--;
    } else {
        temp.getPrev().setNext(temp.getNext());
        temp.getNext().setPrev(temp.getPrev());
        temp.setNext(null);
        temp.setPrev(null);
        counter--;
    }

    System.out.println("Successfully deleted ");
    menu();
}

3 个答案:

答案 0 :(得分:3)

如果不看完整个代码,就无法确定问题。

尽管如此,我会给你一些指示:

<强> 1

... temp.getIndex() != selection ...

链表中的元素跟踪自己的索引通常不是一个好主意。为了保持索引的正确性,每次插入或删除都需要遍历列表才能更新索引。

<强> 2

    else if (selection == size()){

这里可能存在一个错误的错误。

第3

        temp.setPrev(null);
        temp.setNext(null);
        temp.getPrev().setNext(null);

最后一行保证会抛出NullPointerException

一旦解决了这些问题,我建议您在调试器中逐步执行程序,看看实际发生的是您希望在每一步中发生的事情。

答案 1 :(得分:1)

在列出临时指针指向列表末尾的所有元素之后,在搜索元素之前,应该使临时指针再次指向头部。

   temp = head;
    //Gets node matching index with selection and deletes it
    //Next two lines loop through list
    while (temp!=null && temp.getIndex() != selection) {
        temp = temp.getNext();
    }

答案 2 :(得分:1)

双链表有两个指针,它是前一个,下一个是。

如果您要删除该节点,请确保将previous.next指向节点的下一个节点,并将next.previous设置为节点的前一节点。

关于保持索引值,我也不同意,但如果你能完美地做到这一点就没关系。