2013-02-26 53 views
0

我写一个通用的数据结构,它可以添加和从第一或最后一个节点 我测试我的代码删除但我得到了在输入一定的方式例外。异常与Java数据结构

现在如果我addlast仅然后addfirst仅然后removelast我得到异常

,当我addfirst仅很多时间而不增加最后再尝试removelast删除它们()函数,我得到异常 但是当我addlast仅很多时间而不增加第一再由removefirst(删除)它的工作原理

我试图避免在这里循环是代码

import java.util.Iterator; 
public class Deque <Item> implements Iterable <Item> { 

private Node first,last; 

private class Node 
{ 
    Item item; 
    Node next; 
    Node prev; 
} 

public Deque() 
{ 
    first = null; 
    last = null; 
} 

public boolean IsEmpty() 
{ 
    return first == null; 
} 

public void addFirst(Item item) 
{ 
    Node oldfirst = first; 
    first = new Node(); 
    first.item = item; 
    first.next = oldfirst; 
    first.prev = null; 
    if (last == null) 
    { 
     last = first; 

    } 

} 

public void addlast(Item item) 
{ 
    Node oldlast = last; 
    last = new Node(); 
    last.item = item; 
    last.next = null; 
    if (first == null) 
    { 
     first = last; 
    } 
    else 
    { 
     last.prev = oldlast; 
     oldlast.next = last; 
    } 
} 

public Item removeFirst() 
{ 
    Item x = first.item; 
    first = first.next; 
    if (IsEmpty()) 
     last = null; 
    return x; 
} 

public Item removeLast() 
{ 
    if (first == last) 
     return removeFirst(); 
    Item x = last.item; 
    last = last.prev; 
    last.next = null; 
    if (IsEmpty()) 
     first = null; 
    return x; 
} 

public Iterator<Item> iterator() 
{ 
    return new ListIterator(); 
} 

private class ListIterator implements Iterator<Item> 
{ 
    private Node current = first; 

    public boolean hasNext() 
    { 
     return current != null; 
    } 

    public void remove() 
    { 
     //NOt Supported 
    } 

    public Item next() 
    { 
     Item x = current.item; 
     current = current.next; 
     return x; 
    } 

}}

我相信我在removelast()中有last.prev错误,因为它已经是null,然后在last()中引用last = last.perv() 但我想不出一种方法来链接last和last节点第一

任何人都可以帮我这个

这里是主要的,如果你想尝试...

public class Main { 

/** 
* @param args 
*/ 
public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    Deque<Integer> o = new Deque<Integer>(); 
    int num = 0; 
    while (true) 
    { 
     StdOut.println("enter 1 to addfirst, 2 addlast, 3 removefirst, 4 removelast, " + 
       "5 to exit"); 
     num = StdIn.readInt(); 
     if (num == 5) 
      break; 
     switch (num) 
     { 
     case 1: 
      StdOut.println("enter number to add first"); 
      int x = StdIn.readInt(); 
      o.addFirst(x); 
      break; 
     case 2: 
      StdOut.println("enter number to add last"); 
      int y = StdIn.readInt(); 
      o.addlast(y); 
      break; 
     case 3: 
      int w=o.removeFirst(); 
      StdOut.print("the deleted number is: "); 
      StdOut.print(w); 
      StdOut.println(); 
      break; 
     case 4: 
      int z=o.removeLast(); 
      StdOut.print("the deleted number is: "); 
      StdOut.print(z); 
      StdOut.println(); 
      break; 
     default: 
      StdOut.println("Stick with the range!"); 
      break; 
     } 

     for (Iterator<Integer> i=o.iterator(); i.hasNext();) 
     { 
      StdOut.print(i.next()); 
      StdOut.print(" "); 
     } 
     StdOut.println(); 
    } 

} 

} 
+0

“_i得到了异常_” - >哪个异常(以及stacktrace)? “__我试图避免while循环_” - > **为什么?** – jlordo 2013-02-26 18:44:08

回答

1

你已经错过了两个操作。在addFirst中,您没有设置oldFirst.prev = first;,所以如果使用它添加节点,则不会有任何定义的prev引用。这就是为什么removeLast失败。它试图清理遍历到last.prev,但由于与addFirst加入了一切,last.prev为空。

此外,在removeFirst,你有类似的问题,你不删除链接到以前prev节点,如first.prev = null;没有这样做,如果你使用prev引用遍历,你将能够移动超越了第一个节点,在已经叫removeFirst

addLast and addFirst本质上,应该做的事情完全一样,只是在列表的不同部分。 addFirst看起来更简单,在你的实现中,这意味着你错过了addFirstaddLast过于复杂。在这种情况下,你错过了addFirst东西。与删除方法相同。

+0

谢谢先生,这非常有帮助 – Coderji 2013-02-26 19:26:04