簡體   English   中英

有人可以幫助我直觀地看到此反向鏈接列表遞歸嗎?

[英]Can someone help me visualize this reverse Linked List recursion?

問題是要反轉一個單鏈列表,但是我對以下代碼有些困惑:

public ListNode reverseList(ListNode head) {

    if(head == null || head.next == null) return head;

    ListNode temp = head.next;
    head.next = null;
    ListNode result = reverseList(temp);
    temp.next = head;
    return result;
}

第6行做什么?

temp.next = head;

沒有它,結果將僅返回最后一個元素,而不返回反向列表。

我讀的方式是代碼到達第5行,得到結果,經過第6行,然后在第7行返回結果,並不斷重復直到完成。 第6行實際上如何影響代碼?

我很難想象這個遞歸。 有人可以幫忙嗎?

第6行僅在節點之間建立鏈接。 遞歸一直到最后一個節點並使鏈接反向。

遞歸函數通過使用完全相同問題的較小版本來解決問題。 遞歸函數有兩個主要部分:基本案例和遞歸案例。 基本案例是問題的最小版本,我們無需使用遞歸即可提供解決方案。 這是遞歸停止的地方。 遞歸情況假設問題的較小版本提供了正確的解決方案,而我們使用這些解決方案來解決較大版本。

reverseList()將鏈接列表的頭節點作為輸入,反轉列表中的每個節點,然后返回新的反轉列表的頭節點。

假設您有一個鏈表:

a->b->c->d->e

head指向節點a,而temp指向節點b。

在第4行上,節點a與原始列表斷開連接,從而產生兩個子列表,一個子列表僅包含a,另一個子列表包含以b開頭的其他元素。 現在,假設第5行正確地反轉了以b開頭的子列表,我們有:

a
e->d->c->b

head仍指向a,temp仍指向b,結果指向e(反向子列表的頭部)。

為了正確地反轉原始列表,我們只需將節點a(頭)添加到反轉子列表(temp)的末尾。

現在列表是:

e->d->c->b->a

新頭指向e的位置。

編輯:張貼完整代碼。

我寫了一個替代方案,您可能會更好地理解。 我還將功能設置為靜態(不使用getter和setter進行更直接的說明)。

public class ListNode {
    // should be private variables
    int value;    
    ListNode next; 

    ListNode(int val, ListNode nodeList){
        this.value = val;
        this.next = nodeList;
    }

    public static ListNode reverseList(ListNode head) {

        if( head.next.next != null) 
            reverseList (head.next);

        head.next.next = head;
        head.next = null;

        return head;
    }

    @Override
    public String toString(){
        String ret = "";

        if ( next != null ){
            ret = next.toString();
        }       
        ret += String.valueOf(value);
        return ret;
    }
}

public class Main {

    public static void main(String[] args) {
        ListNode n0 = new ListNode(4, null), 
                n1 = new ListNode(3, n0), 
                n2 = new ListNode(2, n1), 
                n3 = new ListNode(1, n2), 
                n4 = new ListNode(0, n3);

        System.out.println(n4);

        ListNode.reverseList(n4);

        System.out.println(n0); // <-- n4 now is the last item, check n0 instead !
    }
}

輸出量

43210
01234

您可能在這里更容易理解。 之前之后進行繪制總是有幫助的。 這樣 ,但只能更改插入框位置的箭頭。

暫無
暫無

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

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