如何从双向链表中提取值?

时间:2013-07-28 05:11:23

标签: java object linked-list nodes doubly-linked-list

我有一个链接在一起的对象链接列表,其中包含第一个,最后一个,下一个,前一个变量,每个变量代表一个列表中的相应节点。这个清单工作正常。

我现在正在尝试添加SUB值(子双向链表)。父列表中的每个项目都包含自己的双向链表。

我在引用原始链接列表中的项目时遇到了问题。

创建值的链接列表后,如何访问它们?

我有什么:

public class Menu<E> {
private mNode first;
private mNode last;
private mNode previous;
private mNode next;
private int size = 0;

public Menu(){
    first = null;
    last = null;
    previous = null;
    next = null;
}

public Menu(E[] elements){
    for (int i = 0; i < elements.length; i++)
        add(elements[i]);
}

private boolean isEmpty(){
    return first == null;
}

public void add(E e){
    mNode currentNode = new mNode(e);

    if(isEmpty())
        first = currentNode;    
    else if (last == null)
        last = currentNode;
    else{
        last.next = currentNode;
        currentNode.previous = last;
        last = currentNode;
    }

    size ++;

}

mNode类还没有真正完全开发,但它在这里供参考:

public class mNode<E> {
E element;
mNode<E> first;
mNode<E> last;
mNode<E> previous;
mNode<E> next;
int index;

public mNode(){

}

public mNode(E e){
    element = e;
}

}

所以再一次,我的问题是,一旦我将一堆元素添加到链表中,我可以遍历它并将它们全部打印出来,但我如何找到并提取特定的菜单项?

编辑:

为清楚起见,我可以说

项目1&lt;&gt;第2项&lt;&gt;项目3&lt;&gt;第4项

全部在第一个列表中。我想添加subitem1&lt;&gt; subitem2&lt;&gt; subitem3到父列表中的第2项。

如何引用第2项的mNode?

创建

后,在main方法中
Menu list = new Menu();
list.add(values)  // adding all 4 menu items

你不能真正做一个list.get(第2项),因为第2项不是菜单内的变量。

3 个答案:

答案 0 :(得分:1)

您需要为菜单对象提供其他方法,例如getByIndex(int n)getByName(String name)(或您的菜单可以访问的任何其他属性)。如果您希望支持getByName()功能,并且使用Map这样的其他结构,您的菜单很大,可能需要考虑。

真正的问题是为什么你需要获得特定菜单的参考?理想情况下,菜单应该有两个责任:a)绘制自己和b)让系统知道其状态发生了变化(即点击)。这就是几乎所有菜单系统都支持一些回调机制的原因,例如在Swing中,您可以附加一个ActionListener,让您知道在菜单上执行操作并对其做出响应。使用这个想法你会有这样的东西(这不是完整的代码只是一个演示):

interface MenuListener {
    public void menuClicked(Menu m);
    // other type of handlers here, when menu state changes e.g. menuExpanded()
}

public class Menu {
    ...
    List<MenuListener> listeners = new ArrayList<MenuListener>();

    // this method will be called internally by each menu when it detects
    // that its state changed
    private void notifyListeners() {
        for (MenuListener listener : listeners) {
            // let all the listeners know this menu was clicked
            listener.menuClicked(this);
        }
    }
}    

// now when menu is created assign a listener to it
Menu item = new Menu(...);
item.addMenuListener( new MenuListener () {
    public void menuClicked(Menu m) {
        // do something with item here
    }
});

答案 1 :(得分:0)

您需要在Menu类findMenu()中再编写一个方法,如果找到元素,则会从头到尾迭代链表,然后它将返回该元素

答案 2 :(得分:0)

您的设计缺少的是每个节点中的数据。

如果您考虑一下,您需要在不同节点中使用不同的数据。有时你可能只有一个菜单项,有时你可以有一个完整的子菜单。子菜单是您设计的另一个列表,因此您将拥有一个列表(或......):这是一个树结构。

对于每个节点,您需要能够询问“此节点是否有子节点?”,“获取子节点”或“获取菜单项”。完成此操作后,您可以考虑OO设计。

当你遍历你的菜单时,你会发现每个节点都有什么,并决定在每种情况下做什么。