在Java中从链表中删除节点

时间:2015-09-16 20:40:00

标签: java insert linked-list

我正在尝试编写处理链表的代码。这个链表在某种程度上是不同的,因为它是一个键值对链表(单独)。链表应该为用户提供基本功能,例如检索链表的大小,检查密钥是否在列表中,插入和删除。除了删除之外,似乎所有功能都正常工作。删除方法的代码正确运行,没有运行时错误,但它给我的结果不是我想要的结果。这是我的代码:

public class SequentialSearch<Key,Value> {

    private int N;     // number of key-value pairs
    private Node head; // the linked list of key-value pairs
    private Node tail;

    // a helper linked list data type
    private class Node {
        private Key key;
        private Value val;
        private Node next;

        public Node(Key key, Value val, Node next) {
            this.key = key;
            this.val = val;
            this.next = next;
        }

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

    public SequentialSearch() {
    }

    public int size() {
        if (head == null)
            return 0;
        else {
            Node x = head;
            while (x.next != null) {
                N++;
                x = x.next;
            }
        }
        return N;
    }

    public boolean isEmpty() {
        return size() == 0;
    }

    public boolean contains(Key key) {
        return get(key) != null;
    }

    public Value get(Key key) {
        for (Node x = head; x != null; x = x.next) {
            if (key.equals(x.key))
                return x.val;
        }
        return null;
    }

    public void put(Key key, Value val) {
        if (val == null) {
            delete(key);
            return;
        }

        for (Node x = first; x != null; x = x.next) {
            if (key.equals(x.key)) {
                x.val = val;
                return;
            }
        }
        first = new Node(key, val, first);
        N++;
    }

    public boolean delete(Key key) {
        Node curr = head;
        Node prev = null;
        boolean result = false;

        if(isEmpty())
            System.err.println("Error: The list is empty.");
        while(curr != null) {
            if(key.equals(curr.key)) {
                if(curr.equals(head)) {
                    head = curr = null;
                    N--;
                    result = true;
                    return result;
                } else {
                    prev.next = curr.next;
                    curr.setNext(null);
                    N--;
                    result = true;
                    return result;
                }
            } else {
                prev = curr;
                curr = curr.next;
            }
        }
        return result;
    }
}

我已经编写了一个主程序来测试add(put)和删除,但它似乎适用于插入但不适用于删除。我想如果列表中只有一个节点以及从列表中间删除节点的情况下我可能会有删除问题。

我也试图通过使用递归编写一个新方法来修改删除方法,但我遇到了一些错误 - 而且逻辑上也是如此。这是该函数的代码:

public void delete(Key key) {
    first = delete(first, key);
}

private Node delete(Node x, Key key) {
    if (x == null) return null;
    if (key.equals(x.key)) {
        N--;
        return x.next;
    }
    x.next = delete(x.next, key);
    return x;
}
你可以告诉我,我做错了什么?

1 个答案:

答案 0 :(得分:1)

head = curr = null;

这句话有点令人困惑,但我认为删除时可能是你的问题。如果您要删除位于'head'的匹配项,您只需要设置为'curr.next'

我的想法是: 删除(a)中

a - &gt; b - &gt; c - &gt; d

head = a
curr = a
curr.next = b

你设置为null,但是头部需要指向新列表中的第一项,如果你删除'a',则为'b'或curr.next