链表清除方法返回已删除的节点和新节点

时间:2015-04-11 23:51:34

标签: java data-structures

我使用链接列表并且我更改了标准的删除方法,因为我想要返回已删除的节点,这是正常的,但也返回它之前的节点,例如,如果我想更改直接引用即我可以前一个节点的尾节点。我想知道如果使用hashmap来实现这一点,如下所示是最好的方法,或者是否有更好的方法来实现我想要的? (注意:下面的代码可以解决,我只是想看看是否有更优雅的解决方案)

public HashMap<String, Node> remove(int i)
{
   if(isEmpty()) return null;
   else
   {
        HashMap<String, Node> temp  =   new HashMap<>();
        if(i == 0)
         {
             temp.put(REMOVE_NODE_KEY, firstNode);
             firstNode   =   (E)firstNode.getNext();
             temp.put(REMOVE_NEW_KEY, firstNode);
         }

         else
         {
             NodeIterator<E> iterator =   new NodeIterator<>(firstNode, i, 1);
             Node prev = iterator.getEnd();

             temp.put(REMOVE_NODE_KEY, prev.getNext());
             prev.setNext(prev.getNext().getNext());
             temp.put(REMOVE_NEW_KEY, prev);
         }

         size--;
         return temp;
   }
}

2 个答案:

答案 0 :(得分:1)

您只需返回一组节点吗?

temp = Node[2];
temp[0] = prev.getNext();
temp[1] = prev.getNext.getNext();
return temp;

答案 1 :(得分:1)

对于这种用法,HashMap相当重。真的,你想要的只是某种带有两个元素的“记录”或“结构”。您可以定义一个简单的类:

public class NodeAndNewKey {
    public Node nodeKey;
    public Node newKey;
    public NodeAndNewKey(Node nodeKey, Node newKey) {
         this.nodeKey = nodeKey;
         this.newKey = newKey;
    }
}

public NodeAndNewKey remove(int i) { //etc.

你可能想出比我更好的名字。

另一种可能性是返回一个2元素数组:

public Node[] remove(int i) { // etc.

并将[0]元素定义为持有“节点键”,将[1]定义为持有“新键”或其他。我不喜欢它,因为它在你使用它时不太可读,但Android库有时会做这样的事情。您可以定义public static final int REMOVE_NODE_KEY = 0; public static final int REMOVE_NEW_KEY = 1;之类的常量,以便在从结果数组中检索元素时使其更具可读性。