2016-02-13 71 views
0

我已经发布了这个代码几次我很抱歉,如果你一直在看这个问题。我一直在这方面做了一些工作,所以任何帮助都会有所帮助,我尽可能地做到了这一点。但是当我的程序打印数据时,它将8和7切换,我找不到原因!这里是所有的代码。而且我还没有开始制作我的删除方法,所以忽略了这个功能。Java双链表打印

public class MyLinkedList<AnyType> implements Iterable<AnyType> { 
    private int theSize; 
    private Node<AnyType> beginMarker; 
    private Node<AnyType> endMarker; 

    public class Node<AnyType> { 
     public Node(AnyType data, Node<AnyType> head, Node<AnyType> tail) { 
      myData = data; 
      myHead = head; 
      myTail = tail; 
     } 

     public AnyType myData; 
     public Node<AnyType> myHead; 
     public Node<AnyType> myTail; 

    } 

    public MyLinkedList() { 
     beginMarker = new Node(null, endMarker, null); 
     endMarker = new Node(null, null, beginMarker); 
     theSize = 0; 
    } 

    public void clear() { 
     beginMarker.myHead = endMarker; 
     endMarker.myTail = beginMarker; 

    } 

    public int size() { 
     return theSize; 
    } 

    public boolean exist(AnyType newVal) { 
     beginMarker.myHead.myData = newVal; 

     if (newVal != null) { 
      return true; 
     } 

     return false; 
    } 

    private void addBefore(Node<AnyType> previousNode, AnyType newNode) { 
     Node<AnyType> new_node = new Node<>(newNode, previousNode.myTail, previousNode); 

     new_node.myTail.myHead = new_node; 
     previousNode.myTail = new_node; 
     theSize++; 
    } 

    public boolean add(AnyType newVal) { 
     { 
      add(size(), newVal); 
      return true; 
     } 
    } 

    public boolean add(int index, AnyType newVal) { 
     addBefore(getNode(index, 0, size()), newVal); 

     return true; 
    } 

    private Node<AnyType> getNode(int index) { 
     return getNode(index, 0, size() - 1); 
    } 

    public Node<AnyType> get(AnyType nodeData) { 
     Node<AnyType> node = beginMarker; 

     while (node != endMarker) { 

      // Means node.data = nodeData 
      if (node.myData.equals(nodeData)) { 
       return node; 
      } 
     } 
     return null; 
    } 

    // Added method 
    private Node<AnyType> getNode(int index, int lower, int upper) { 
     Node<AnyType> x; 

     if (index < lower || index > upper) 
      throw new IndexOutOfBoundsException(); 

     if (index < size()/2) { 
      x = beginMarker.myHead; 
      for (int i = 0; i < index; i++) 
       x = x.myHead; 
     } else { 
      x = endMarker.myTail; 
      for (int i = size(); i > index; i--) { 
       x = x.myTail; 

      } 
     } 
     return x; 
    } 

    public void printList() { 
     Node temp = beginMarker.myHead; 

     while (temp != null) { 
      System.out.println(temp.myData); 
      temp = temp.myHead; 
     } 
    } 

    public java.util.Iterator<AnyType> iterator() { 
     return new LinkedListIterator(); 
    } 

    public void remove(AnyType removeVal) { 
     /* 
     * if(node.myData.equals(nodeData)) 
     * 
     * MyLinkedList testList = new MyLinkedList(); 
     * 
     * Node temp = testList.beginMarker.myData; while(temp != null){ 
     * 
     * if(temp == removeVal){ temp.myTail = temp.myHead; temp.myHead = 
     * temp.myTail; } else{ temp.myHead = temp; } 
     * 
     * 
     * } 
     */ 
    } 

    private class LinkedListIterator implements java.util.Iterator<AnyType> { 

     private Node<AnyType> node_ = beginMarker; 

     public void remove() { 

     } 

     public boolean hasNext() { 
      if (node_.myHead != null) { 
       return true; 
      } 
      return false; 
     } 

     public AnyType next() { 
      if (!hasNext()) { 
       return null; 
      } 
      node_ = node_.myHead; 
      return node_.myData; 
     } 
    } 

    private static void testListIntegers() { 
     MyLinkedList<Integer> testList = new MyLinkedList<Integer>(); 
     testList.add(new Integer(5)); 
     testList.add(new Integer(4)); 
     testList.add(new Integer(3)); 
     System.out.println(" We have so far inserted " + testList.size() + " elements in the list"); 
     testList.remove(4); 
     System.out.println(" Now, there is only " + testList.size() + " elements left in the list"); 
     testList.add(1, new Integer(7)); 
     testList.add(2, new Integer(8)); 
     System.out.println(" About to print content of the list"); 
     testList.printList(); 
    } 

    private static void testListStrings() { 
     MyLinkedList<String> testList = new MyLinkedList<String>(); 
     testList.add(new String("hello")); 
     testList.add(new String("this is")); 
     testList.add(new String("cs3345 project 2")); 
     System.out.println(" We have so far inserted " + testList.size() + " elements in the list"); 
     testList.remove("this is"); 
     System.out.println(" Now, there is only " + testList.size() + " elements left in the list"); 
     testList.add(1, "a modified version of"); 
     testList.add(2, "cs3345 project 2, call it version 2"); 
     System.out.println(" About to print content of the list"); 
     testList.printList(); 
    } 

    public static void main(String args[]) throws Exception { 
     // Add whatever code you need here 
     // However, you will need to call both testListIntegers() 
     // and testListStrings() 
     testListIntegers(); 
     testListStrings(); 

    } 
} 

输出如下:

We have so far inserted 3 elements in the list 
Now, there is only 3 elements left in the list 
About to print content of the list 
8 
7 
3 
4 
5 
We have so far inserted 3 elements in the list 
Now, there is only 3 elements left in the list 
About to print content of the list 
cs3345 project 2, call it version 2 
a modified version of 
cs3345 project 2 
this is 
hello 
+0

什么是AnyType类? – pczeus

+0

它没有类,因为我的LinkedList正在使用相同的代码取整数和字符串。我们的教授通过哈哈的方式给了我们这个代码(我讨厌它的结构)。我希望能回答你的问题。 –

+0

@ErikNyström,add函数使用1处的索引来添加7.所以它将8和7混合在一起。它让我疯狂起来,因为我已经逐字地遍历了我的代码,并且一切都在逻辑上合理。 –

回答

1

问题是addBefore方法:

private void addBefore(Node<AnyType> previousNode, AnyType newNode) { 
    Node<AnyType> new_node = new Node<>(newNode, previousNode.myTail, previousNode); 

    new_node.myTail.myHead = new_node; 
    previousNode.myTail = new_node; 
    theSize++; 
} 

这是相同的,如:

private void addBefore(Node<AnyType> previousNode, AnyType newNode) { 
    Node<AnyType> new_node = new Node<>(newNode, previousNode.myTail, previousNode); 

    previousNode.myHead = new_node; 
    previousNode.myTail = new_node; 
    theSize++; 
} 

所以基本上你是双重打击d列表。

编辑:

根据算法描述here这种方法应该是这样的:

private void addBefore(Node<AnyType> previousNode, AnyType newNode) { 
    Node<AnyType> new_node = new Node<>(newNode, previousNode, previousNode.myTail); 
    if(previousNode.myTail==null){ 
     beginMarker.myHead = new_node; 
    } else { 
     previousNode.myTail.myHead = new_node; 
    } 
    previousNode.myTail = new_node; 
    theSize++; 
} 

看到你的列表是从0索引,以便输出应该是:

5 
7 
8 
4 
3 

接下来的问题是在printList方法(无限循环),因为某处是错误的使用o f你的开始/结束标记。

+0

这很有道理。我想我不知道如何创建该方法。你能把我推向正确的方向吗? –

+0

查看我所做的修改。 – glw

0

加上size--;在删除方法结束时应将元素从3减少到1