2017-08-31 1 views
1

ListNodesは本当に私を混乱させてしまいました。コードの断片を理解するために、コードを理解しようとしていますが、それを私に説明してください。リンクされたリストを元に戻す(ヘルプ)

// Definition for singly-linked list: 
// class ListNode<T> { 
// ListNode(T x) { 
//  value = x; 
// } 
// T value; 
// ListNode<T> next; 
// } 
// 

ListNode<Integer> reverse(ListNode<Integer> l) { 
    if(l==null||l.next==null) 
     return l; 

    ListNode<Integer> p1 = l; 
    ListNode<Integer> p2 = p1.next; 

    l.next = null; 

    while(p1!=null&& p2!=null){ 
     ListNode<Integer> t = p2.next; 
     p2.next = p1; 
     p1 = p2; 
     p2 = t; 
    } 

    return p1; 

} 
+1

これはどの言語ですか? – OmegaNalphA

+0

@OmegaNalphA it javaです – csmajor97

答えて

0

基本的に、彼らはその一時変数に新しいp2のポイントを作り、P1とP2の間にポインタを切り替え、余分な値P2を保持する一時変数tを指しているします。彼らはすでにp2.nextがp1を指していると宣言しているので、p2が次の行に置き換えても削除されることはありません。

これはちょっと奇妙なことですが、通常はポインタがここに表示されている方法よりもむしろシャッフルされています。

+0

私が理解していないのは、一時変数tがp2.nextの初期値をどのように保持できるかです。たとえば、ListNode p1 = lとし、l.next = nullとすると、p1.next = nullも発生します。ですから、もしp2.next = p1を変更しているのであれば、ListNode t = p1も意味しませんか? – csmajor97

+0

私はこの場合、javaのように値をコピーしていますが、実際にポインタを扱わないので、p2.nextにあるオブジェクトのコピーであると確信しています。実行するたびに、tとp2.nextの値を表示します(たとえば、各ノードに文字列を挿入して増分する)し、何が起こるか/どのように変化するかを確認することができます – OmegaNalphA

関連する問題