1

私のアルゴ-

private static MyList skip$DeleteItem(MyList L , int M , int N){
    MyList curr = L;
    MyList prev = null;
    while(curr != null){
        int counter = 0;
        while(curr != null && counter <M){
            prev = curr;
            curr = curr.next;
            counter++;
        }
        counter = 0;
        while(curr != null && counter < N){
            curr = curr.next;
            if(prev == null){                   
                prev = curr;
            }
            else{               
            prev.next = curr;
            }               
            counter ++;
        }
    }

    return L;
}

これはすべての基本的なテストケースで機能しますが、値0をスキップして1を削除すると失敗します。

入力-9->34->8-> 7-> 5--> 4-> 6 ---> 3-> 1 ---> 2-> TAIL

Ouput-9-> 34-> TAIL

期待される-NULL(すべての要素を削除する必要があるため)

解決策は

while(curr != null && counter < N){     
                curr = curr.next;
                if(prev == null){                   
                    curr = curr.next;
                    L = curr;
                }
                else{               
                prev.next = curr;
                }               
                counter ++;
            }
4

1 に答える 1

2

「スキップ」部分は問題ないようですが、削除部分には問題があります。

while(curr != null && counter < N){
        curr = curr.next;
        if(prev == null){                   
            prev = curr;
        }
        else{               
        prev.next = curr;
        }               
        counter ++;
    }

最初の反復では、最初にcurrポインターを次の要素に if(prev == null)進め、次にprevを同じcurrに進めます。

したがって、あなたの例では、最初の反復の終わりに、currとprevの両方が34を指します。それ以降、リストの残りの部分は適切に削除されます。

于 2012-05-01T07:15:25.667 に答える