2017-04-03 118 views
1

我構建了一個自定義鏈表來維護類Student的Node對象。 在一個方法int countNodesRec(Node list)中,我必須傳遞一個Node對象作爲參數。將我的Student對象添加到鏈接列表中時,它們作爲節點對象存儲在鏈接列表中。但是,我不知道如何傳遞頭節點對象作爲參數,所以我可以遞歸遍歷鏈表。另外,我不需要該方法的代碼幫助。順便說一下,我的課程完全按照項目的規定進行設計。感謝您的幫助!鏈接列表Java中的節點作爲參數的遞歸

TestList類:

public class TestList {  
    public static void main(String[] args) { 
    Student s1 = new Student("Adams", 3.9, 26); 
    Student s2 = new Student("Lewis", 2.1, 29); 
    Student s3 = new Student("Lopez", 4.0, 53); 
    Student s4 = new Student("Smith", 3.2, 22); 
    Student s5 = new Student("Zeeler", 3.6, 38); 
    LinkedList list1 = new LinkedList(); 
    LinkedList list2 = new LinkedList(); 
    LinkedList list3 = new LinkedList(); 
    //Adds students to LinkedLists and invokes methods to display their data 
    list1.addFront(s1); 
    list1.addFront(s2); 
    list1.addFront(s3); 
    list1.addFront(s4); 
    list1.addFront(s5); 
    list1.printLinkedList(); 
    System.out.println("Best student: " + list1.bestStudent());  
    list1.countNodesRec(//Don't know how to pass Node);   
    }   
} 

學生類別:

public class Student 
{ 
    private String lastName; 
    private double gpa; 
    private int age; 

    public Student(String lastName, double gpa, int age) 
    { 
    this.lastName = lastName; 
    this.gpa = gpa; 
    this.age = age;  
    } 

    public int compareTo(Student s) 
    { 
    if (gpa < s.gpa) 
     return -1; 
    else if (gpa > s.gpa) 
     return 1; 
    else 
     return 0; 
    } 

    @Override 
    public String toString() 
    { 
    return lastName + "\t" + gpa + "\t" + age; 
    } 

    public double getGpa() 
    { 
    return gpa; 
    } 
} 

LinkedList類:

public class LinkedList 
{ 
    private Node list; 
    public LinkedList() 
    { 
    list = null; 
    } 

    // Adds a Node object to the front of the LinkedList 
    public void addFront(Student s) 
    { 
    if (list == null) 
     list = new Node(s); 
    else 
    { 
     Node temp = new Node(s); 
     // Assigns Node s next reference to the 
     // object at the beginning of the LinkedList 
     temp.next = list; 
     //Beginning of the list now equals Student s 
     list = temp; 
    } 
    } 

    // Adds a Node object to the back of the LinkedList 
    public void addTail(Student s) 
    { 
    Node node = new Node(s); 
    Node current; 
    if (list == null) 
     list = node; 
    else 
    { 
     current = list; 
     while (current.next != null) 
     current = current.next; 
     current.next = node; 
    } 
    } 

    public Student bestStudent() 
    { 
    Student bestStudent, bestStudentInner; 
    Node current; 
    if (list == null) 
     return bestStudent = null; 
    else 
    { 
     current = list; 
     bestStudentInner = new Student("base case", 0.00, 0); 
     while (current != null) 
     { 
     if (bestStudentInner.getGpa() <= current.data.getGpa()) 
      bestStudentInner = current.data; 
     current = current.next; 
     } 
     bestStudent = bestStudentInner; 
    } 
    return bestStudent; 
    } 

    public void printLinkedList() 
    { 
    Node current; 
    if (list == null) 
     System.out.println("Empty"); 
    else 
    { 
     current = list; 
     while (current != null) 
     { 
     System.out.println(current.data.toString()); 
     current = current.next; 
     } 
    }   
    } 

    public int countNodesRec(Node list) 
    { 
    //To-do here; 
    } 

    public Student worstStudentRec(Node list) 
    { 
    //To-do here; 
    } 



    // Inner class that creates Nodes to be stored in LinkedList 
    private class Node 
    { 
    public Student data; 
    public Node next; 

    public Node(Student s) 
    { 
     data = s; 
     next = null;  
    }  
    } 
} 

回答

0

要通過頭節點,你只需要通過其有史以來節點是第一您的鏈接列表中的節點,在這種情況下,它是s5。但是,您接收一個學生對象並在其周圍創建一個節點,然後將其添加到您的列表中,當前唯一的節點是列表,該列表是駐留在列表數據結構中的一個私有節點對象。爲了使用該方法,您必須將它傳遞給您的頭部,但是由於它是私人的,因此無法從main中執行此操作。你可以讓列表公開並執行以下操作

list1.countNodesRec(list1.list); 

如果你不想讓節點列表對象公開我建議你創建一個內生的Node對象,並通過這些你鏈表結構。你也可以做以下

list1.countNodesRec(new Node(s5)); 

主要的問題是你需要的countNodesRec參數,但LinkedList類有它的頭一個參考,所以沒有必要通過頭時,它已經包含在你的LinkedList結構,即Node名稱列表。

+0

這不起作用,因爲S5是學生對象。我收到一個錯誤,說學生不能轉換爲LinkedList.Node – JMarotta

0

我不知道你爲什麼使用兩個節點這個例程;由於沒有代碼,我不知道哪些功能需要這種對偶性。

list1本身是對列表頭節點的引用。您在代碼中反覆使用該屬性。您應該只能通過列表調用該方法。當你再次發生時,你在this.next上這樣做,這是其餘列表的頭部。

節點和列表頭沒什麼特別的區別:每個節點都是一個列表的頭部,它繼續其下一個參考。

這是否爲您清理了結構?

+0

我可以調用方法爲list1.countNodesRec(節點列表)。我只是不知道如何傳遞該方法中list1的頭部的Node對象作爲參數。 – JMarotta

+0

你已經擁有*頭節點!它是** list1 **,在方法內部顯示爲** this **。如果你堅持兩個引用,你可以用** list1.countNodesRec(list1)**來調用它,但這是多餘的和危險的。 ** list1 ** *是一個Node對象。 – Prune

+0

...或者你可能想要更直接的參考** list1.list **?再次,這是危險的,將一對緊密相關的指針傳遞到例程中,但允許它們顯示爲不相關。 – Prune

0

您需要在LinkedList類中使用getList()方法。然後在測試類中,您應該相應地使用該方法。例如:list1.countNodesRec(list1。 )的GetList())

0

由於列表的頭是私人領域,我想補充一個參數方法:

public int countNodesRec() { 
    return countNodesRec(list); 
}