2016-10-10 59 views
0
public class doubleLinkedList { 

    class Node { 
     String value; 
     Node prev; 
     Node next; 

     Node(String val, Node p, Node n) { 
     value = val; 
     prev = p; 
     next = n; 
     } 

     Node(String val) { 
     value = val; 
     prev = null; 
     next = null; 
     } 
    } 

    Node first; 
    Node last; 

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

    public boolean isEmpty() { 
     if (first == null) 
     return true; 
     else 
     return false; 
    } 

    /**The size method returns the length of the linked list 
    * @return the number of element in the linked list 
    */ 
    public int size() { 
     int count = 0; 
     Node traverse = first; 
     while (traverse != null) { 
     count++; 
     traverse = traverse.next; 
     } 
     return count; 
    } 


    public void add(String element) { 

     if (isEmpty()) { 
     first = new Node(element); 
     last = first; 
     } else { 

     Node p = first; 
     Node elementTobeAdded; 
     while (((p.value).compareTo(element)) > 0 && p.next != null) { 
      p = p.next; 
     } 

     if (p.next != null) { 
      elementTobeAdded = new Node(element, p, p.next); 
      p.next.prev = elementTobeAdded; 
      p = elementTobeAdded.prev; 
     } else { 
      elementTobeAdded = new Node(element, p, null); 
      p.next = elementTobeAdded; 
      elementTobeAdded.next = null; 
      last = elementTobeAdded; 
     } 

     } 
    } 

    public void printForward() { 
     Node printNode = first; 
     while (printNode != null) { 
     System.out.print(printNode.value + ", "); 
     printNode = printNode.next; 
     } 
    } 
    } 
    public class test { 

    public static void main(String[] args) { 
     doubleLinkedList car = new doubleLinkedList(); 
     car.add("Jeep"); 
     car.add("benz"); 
     car.add("Honda"); 
     car.add("Lexus"); 
     car.add("BMW"); 
     car.printForward(); 
    } 
    } 

我的add方法試圖按照字母順序將節點添加到列表中。我的printForward方法打印列表中的每個元素。 在我的主要方法,它打印出「吉普,奔馳,本田,寶馬,」這是不是按字母順序。爲什麼我的方法無法按字母順序排序鏈接列表?

+4

你用調試器通過了你的代碼嗎? –

+0

https://ericlippert.com/2014/03/05/how-to-debug-small-programs/ – David

回答

0

它不是一個鏈表...你寫了某種排隊(有可能使它成爲排隊)。

關於你的問題 - 你的'添加'方法有錯誤 - 至少你不檢查是否有必要前進。這可能是你有另一種錯誤,但爲時已很難讀這樣的風格來源(請修正你的問題的格式)...

1

更改不是空的情況下,你的add方法從這個

Node p = first; 

    Node elementTobeAdded; 

    while(((p.value).compareTo(element)) > 0 && p.next != null) 
    { 
    p = p.next; 
    } 

    if(p.next != null) 
    { 
    elementTobeAdded = new Node(element,p,p.next); 
    p.next.prev = elementTobeAdded; 
    p = elementTobeAdded.prev; 
    } 

    else 
    { 
    elementTobeAdded = new Node(element, p, null); 
    p.next = elementTobeAdded; 
    elementTobeAdded.next = null; 
    last = elementTobeAdded; 
    } 

對此:

Node p = first; 
    while (p.value.compareTo(element) < 0 && p.next != null) { 
    p = p.next; 
    } 
    if (p.value.compareTo(element) > 0) { 
    Node toAdd = new Node(element, p.prev, p); 
    p.prev = toAdd; 
    if (toAdd.prev != null) { 
     toAdd.prev.next = toAdd; 
    }else { 
     first = toAdd; 
    } 
    }else { 
    Node toAdd = new Node(element, p, p.next); 
    p.next = toAdd; 
    if (toAdd.next != null) { 
     toAdd.next.prev = toAdd; 
    }else { 
     last = toAdd; 
    } 
    } 

這裏有很多錯誤。最大的問題是,你從來沒有檢查過應該在列表開頭插入新元素的情況。一個新的元素總是插在第一個元素之後,即使它應該先到達。

請注意,「benz」的結尾是因爲String.compareTo方法將大寫字母視爲小寫字母。