2016-07-10 34 views
1

我一直在研究一個算法,以將元素添加到鏈接列表中,並在添加元素時對其進行排序。我的代碼工作正常,我大部分都知道爲什麼,但我很驚訝地看到這個代碼在列表的末尾添加元素。這裏的代碼:爲什麼這個LinkedList排序算法有效?

public void add(int value) 
    { 
    Node currentNode; 
    Node previousNode; 
    Node newNode; 
    if(firstNode == null) 
    { 
     firstNode = new Node(value,firstNode); 
    } 

    else 
    { 
    currentNode = firstNode; 
    previousNode = null; 

    while(currentNode != null && value > currentNode.getValue()) 
    { 
     previousNode = currentNode; 
     currentNode = currentNode.getNextNode(); 
    } 
     if(previousNode == null) 
     { 
     firstNode = new Node(value, firstNode); 
     } 
     else 
     { 
     newNode = new Node(value,currentNode); 
     previousNode.setNextNode(newNode); 
     } 
    } 
    } 

所以我知道這將工作添加到開始或中間,但它如何增加到最後?我的意思是,如果while循環遍歷到列表的末尾,然後currentNode是最後一個節點,一個節點是一個過,所以不會:

newNode = new Node(value,currentNode); 
previousNode.setNextNode(newNode); 

元素絕不添加結束了嗎?它不會總是在之前和當前之間添加新節點嗎?

+0

如果while語句到達末尾,則currentNode爲空。 –

+2

如果將節點23插入空列表,然後插入節點10,代碼是否真的起作用?我沒有看到代碼將前面的列表前面的代碼鉤到新列表的下一個節點上。而且,使用全局變量'firstNode'的設計本質上將您限制爲一個列表。一個更好的設計會安排將當前前端列表傳遞給函數,並返回新的前端列表。 –

+0

是的,它的作品。如果值低於列表中的任何值,則if(previousNode == null) firstNode = new Node(value,firstNode);當然是叫做 –

回答

4

previousNode,顧名思義,指向當前節點後面的節點。 當你到達最後,(當你試圖插入的值大於當前元素時,會發生這種情況)currentNode變爲null,但是previousNode指向最後一個節點。因此,previousNode.setNextNode(newNode)工作正常。

+0

啊。我認爲currentNode會是列表中的最後一個節點,而不是null。我猜null是最後一個 –