Java删除节点链表无法正常工作

时间:2014-10-16 01:34:15

标签: java linked-list

我有一个工作方法,用于删除给定密钥的链表中的节点。那时我的Node类嵌套在LinkedList类中,我可以直接访问节点类的成员(例如head.next和head.data)。我重构了代码以拥有一个单独的Node类,并为数据和下一个成员设置了accessor和mutator方法。 (我正在准备面试,所以我正在处理许多链接列表问题,所以我认为有一个单独的类使得我不需要复制和粘贴大量代码。

这是我的Node.java:

package linkedlistproblems;

public class Node {
    private int data;
    private Node next;

    public Node(int data) {
        this.data = data;
        this.next = null;
    }

    public int getData() {
        return data;
    }

    public void setData(int data) {
        this.data = data;
    }

    public Node getNext() {
        return next;
    }

    public void setNext(Node next) {
        this.next = next;
    }
}

我从LinkedList.java中删除节点的方法:

// delete node with key = data
public void deleteNode(int data) {
    System.out.println("Deleting node with key = " + data);
    if (head == null) {
        System.out.println("Linked list does not contain key = " + data);
        return;
    }
    else if (head.getData() == data) {
        Node temp = head;
        head = head.getNext();
        nElements--;
        temp = null;
    }
    else {
        Node n1 = head;
        Node n2 = head.getNext();
        while(n2 != null) {
            if (n2.getData() == data) {
                n1.getNext().setNext(n2.getNext());
                nElements--;
                break;
            }
            n1 = n1.getNext();
            Node temp = n2;
            n2 = n2.getNext();
            temp = null;
        }
        if (n2 == null)
            System.out.println("Linked list does not contain key = " + data);
    }
}

此方法不起作用。在检查数据后,它会进入 if ,但不会删除节点。

以下是有效的旧方法:

// delete node with key = data
public void deleteNode(int data) {
    System.out.println("Deleting node with key = " + data);
    if (head == null) {
        System.out.println("Linked list does not contain key = " + data);
        return;
    }
    else if (head.data == data) {
        Node temp = head;
        head = head.next;
        nElements--;
        temp = null;
    }
    else {
        Node n1 = head;
        Node n2 = head.next;

        while (n2 != null) {
            if (n2.data == data) {
                n1.next = n2.next;
                nElements--;
                break;
            }
            n1 = n1.next;
            Node temp = n2;
            n2 = n2.next;
            temp = null;
        }

        if (n2 == null) 
            System.out.println("Linked list does not contain key = " + data);
    }
}

这是测试代码的主要方法:

public static void main(String[] args) {
    LinkedList ll = new LinkedList();
    ll.add(70);
    ll.add(10);
    ll.add(55);
    ll.add(22);
    System.out.println("Original List: " + ll);
    ll.deleteNode(70);
    System.out.println(ll);
    ll.deleteNode(22);
}

我已经重写了toString方法来漂亮地打印链表(这里没有显示)。我不确定为什么使用accesssor mutators的重构方法不起作用。

输出:

Original List: 70 ---> 10 ---> 55 ---> 22 ---> NULL
Deleting node with key = 70
10 ---> 55 ---> 22 ---> NULL
Deleting node with key = 22
10 ---> 55 ---> 22 ---> NULL
10 ---> 55 ---> 22 ---> NULL

此外,每当我删除一个节点时,我将其分配给temp,将其从列表中删除并将temp指定为null。我这样做是为了防止游荡。我这样做了吗?

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

原始行的逻辑

n1.next = n2.next;

与新实施不匹配

n1.getNext().setNext(n2.getNext());

这相当于

n1.next.next = n2.next;

来自原始实现