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

输出 - 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 回答