-1

我想編寫一個程序,用於在java中使用單向鏈表進行快速排序。通過參考值不工作在java

以下是代碼。

public class QuickSortInSLinkedList { 
Node head; 
private static class Node{ 
    private int data; 
    private Node next; 

    Node(int data){ 
     this.data = data; 
     this.next = null; 
    } 
} 


public void printList(Node head){ 
    Node node = head; 
    while(node != null){ 
     System.out.print(node.data+" ,"); 
     node = node.next; 
    } 
} 

private Node getLastNode(Node head){ 
    Node node = head; 
    while(node != null && node.next != null){ 
     node = node.next; 
    } 
    return node; 
} 

public void push(int data){ 
    Node node = new Node(data); 

    if(head == null){ 
     head = node; 
     return; 
    } 

    node.next = head; 
    head = node; 
} 

void quickSort(Node head){ 
    Node lastnode = getLastNode(head); 
    head = _quickSort(head, lastnode); 
    return; 
} 

Node _quickSort(Node low, Node high){ 
    Node newHead = null, newTail = null; 

    if(low == null || low == high){ 
     return low; 
    } 

    Node part = partition(low, high, newHead, newTail); 

    if (newHead != part){ 
     Node temp = newHead; 
     while(temp.next != part){ 
      temp = temp.next; 
     } 

     temp.next = null; 

     newHead = _quickSort(newHead, temp); 
     temp = getLastNode(newHead); 
     temp.next = part; 

    } 

    part.next = _quickSort(part.next, newTail); 
    return newHead; 
} 

private Node partition(Node low, Node high, Node newHead, Node newTail){ 
    Node pivot = high; 
    Node previous = null, current = head, tail = pivot; 

    while(current != pivot){ 
     if (current.data < pivot.data){ 
      if (newHead == null) 
       newHead = current; 

      previous = current; 
      current = current.next; 
     }else{ 
      if(previous != null) 
       previous.next = current.next; 

      Node temp = current.next; 
      current.next = null; 
      tail.next = current; 
      tail = current; 
      current = temp; 
     } 
    } 

    if(newHead == null){ 
     newHead = pivot; 
    } 

    newTail = tail; 

    return pivot; 
} 

public static void main(String[] args){ 
    QuickSortInSLinkedList list = new QuickSortInSLinkedList(); 
    list.push(5); 
    list.push(35); 
    list.push(7); 
    list.push(8); 
    list.push(34); 
    list.push(23); 

    System.out.println("Linked list before sorting"); 
    list.printList(list.head); 

    System.out.println("\n Linked list after sorting"); 
    list.quickSort(list.head); 
    list.printList(list.head); 

} 

}

我明白的是,由於在Java中,我們具有由參考值通,此代碼應該工作,但在線路62即變量newHead和newTail總是接收作爲空調用分區方法之後。

下面

在implementation.sorting.QuickSortInSLinkedList $ Node.access $ 100(QuickSortInSLinkedList錯誤

異常在線程 「主」 顯示java.lang.NullPointerException 23,34,8,7,35,5, 的.java:6) 在implementation.sorting.QuickSortInSLinkedList在implementation.sorting.QuickSortInSLinkedList.quickSort(QuickSortInSLinkedList.java:47) 在implementation.sorting.QuickSortInSLinkedList._quickSort(QuickSortInSLinkedList.java:62) 排序 後鏈表。 main(QuickSortInSLinkedList.java:123)

請幫我理解爲什麼會這樣。 謝謝

+0

Java嚴格遵循值傳遞,而不是通過引用傳遞(http://stackoverflow.com/q/40480/4125191)。 – RealSkeptic

+0

我通過這個鏈接https://stackoverflow.com/questions/5298421/why-doesnt-java-support-pass-by-reference-like-c,它提到 - 「它通過值傳遞對象引用,因爲兩個副本同一個引用的引用是指同一個實際對象,通過一個引用變量所做的更改通過另一個引用變量是可見的。「 ,我很困惑那樣,newHead也應該被修改? – Astlez

+0

是的,你很困惑。如果參數是一個對象,則該對象不會被重複,並且對該對象**的**字段所做的任何更改都將在該方法之外看到。但是參數*本身*不能改變 - 你不能改變參數(你可以,但不能在方法之外看到),你只能修改它引用的對象中的字段。 – RealSkeptic

回答

0

Java確實通過引用來操作對象,並且所有對象變量都是引用。但是,Java不會通過引用傳遞方法參數;它通過價值傳遞它們。