[英]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.