2017-09-19 6 views
-1

再帰を使用してリンクリストを逆転させるコードをたどってきましたが、何か問題は見つけられませんが、うまくいきません。なぜ誰かが説明してくれますか?リバースリンクリスト再帰

Node reverseLL (Node head) { 
    if(curr.next == null) { 
    head = curr; 
    return head; 
    } 

    Node curr = head.next; 
    prev = head; 
    head.next = prev; 
    head = next; 
    reverseLL(head.next); 
} 
+0

は、どのようにそれを宣言する前に 'curr'を使用することができますか? – Ravi

答えて

1

は、いくつかの助けの構造を追加、あなたのコードの作業バージョンです:

class LList { 
    Node head; 

    void reverse() { 
     head = rev(head, head.next); 
    } 

    private Node rev(Node node, Node next) { 
     if(next == null) return node; //return the node as head, if it hasn't got a next pointer. 
     if(node == this.head) node.next = null; //set the pointer of current head to null. 

     Node temp = next.next; 
     next.next = node; //reverse the pointer of node and next. 
     return rev(next, temp); //reverse pointer of next node and its next. 
    } 
} 

class Node { 
    int val; 
    Node next; 
    public Node(int val, Node next) { 
     this.val = val; 
     this.next = next; 
    } 
} 
0

あなたはリストを下に横断し、上向きに最後のノードから開始するように、切り替え前reverseLL(head.next)を呼び出す必要があります。しかしこれにはさらにいくつかの変更が必要です。以下は