簡體   English   中英

遞歸打印單個鏈表作業

[英]Recursive printing of a singly linked list homework

我在java類中有一個作業,需要以遞歸的方式反向打印出鏈表。 我在網上查看了很多遞歸方法的示例,這些示例執行此操作,但是將節點作為參數,據我的理解,我需要輸入一個鏈表,因為我需要打印出整個列表。 下面是我編寫的代碼,在某種意義上說,它可以遞歸地打印列表,但它仍然與我創建列表的順序相同。 在打印出列表之后,它也不會引發此類異常。 我的主要問題/問題是如何最好地遞歸打印。

public void printRecurse2(LinkedList<String> list2)
{
    if(list2 == null)
        return;
    System.out.println(list2.pop());
    printRecurse2(list2);

}

您需要檢查該節點是否還有另一個下一個節點。 這樣,您就可以延遲打印每個元素,直到到達列表的末尾:

void printReverse(Node node) {
    if(node.next != null) { // recurse until the last node is found
        printReverse(node.next);  // print the next node first
    }
    System.out.println(node.data); // print out the node(this is only reached after the last node is found
}

這將通過傳遞鏈接列表的第一個節點來打印整個列表。 然后,您無需將整個列表傳遞給每個呼叫。 您還可以通過更改傳遞給第一個調用的節點來使用它僅打印列表的一部分。

您的list永遠不會為null ,這就是遞歸不會及時停止的原因。 您需要檢查列表是否不為空,而不是為空,例如

if(list2.peek() == 0)
    return;
System.out.println(list2.pop());
printRecurse2(list2);

這避免了異常。 要反向打印,您需要從列表的另一端開始:

if(list2.peekLast() == null)
    return;
System.out.println(list2.pollLast());
printRecurse2(list2);

因為這是家庭作業,所以我僅會指導您,而不是給您答案。

在任何遞歸函數中,您至少需要一個基本案例才能結束遞歸。 您已選擇if (list2 == null)作為基本情況。 在每個函數調用的最后,您要調用printRecurse2(list2) ,其中list2彈出了一個元素。 無論如何, list2將存在,並且不等於null 但是,它可能空的 考慮更改您的基本情況。

關於刪除項目的順序,請考慮Java API for pop() 彈出從列表中刪除第一項。 因此,第一次調用printRecurse2() ,第一項將被彈出並打印。 下次,第二個項目現在將彈出並打印。 您可能需要研究另一個方法,例如removeLast()

如果需要反向獲取元素,請嘗試使用LinkedList API中的removeLast()方法,它將返回然后刪除LinkedList中的最后一個元素:

public void printRecurse2(LinkedList<String> list)
{
    if(list.isEmpty()) //base
        return;
    System.out.println(list.removeLast()); //print the last element
    printRecurse2(list); //recurse
}

此外,由於此方法消耗了LinkedList您可能希望將LinkedList的副本傳遞給此方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM