将一元转换器应用于链表

Apply a unary transformer to a linkedlist

我一直在做一道练习题。这个想法是我应该采用一个链表,然后将一元变换器应用于该列表,然后 return 修改后的列表。我没有应用特定的更改,只是处理和 return 一个链表。下面是分解,以及说明中提供的 UnaryTransformer 方法:

"如果L是该类型对象链表的头部 Q 和 R 是一个 UnaryTransformer,那么 transformAll(L,R) 是通过将 R 应用于每个对象而获得的对象的链表 L 中的对象按顺序排列。

{@code UnaryTransformer} objects are used to represent functions with the signature:

public interface UnaryTransformer<Q> {
      /**
       * Returns the result of applying a function modeled by
       * {@code UnaryTransformer} to the given object
       *
       * @param object the object to transform
       * @return the result of applying a function
       */
    Q apply(Q object);
}

到目前为止我有这段代码,但它无法编译。

public static transformAll(Node L, R) {
    if (L != null) {
    LinkedList<Q> sequence = new LinkedList<Q>();

    for (int i = 0; i < size(); i++) {
        if (p.apply(get(i))){
            sequence.add(get(i));
            }
        }
return sequence;
    }
} 

你很接近!假设您的 get 方法 return 是索引 iLinkedList 的一个元素,调用它两次将 return 相同的元素,无论它是否被映射。您应该将 R.apply 的结果直接传递给新的 LinkedList 以确保它 映射的:

public LinkedList<Q> transformAll(Node L, UnaryTransformer<Q> R) {
    if (L == null) {
        return null;
    }

    LinkedList<Q> sequence = new LinkedList<>();

    for (int i = 0; i < size(); i++) {
        sequence.add(R.apply(get(i)));
    }

    return sequence;
}

记住get for LinkedList是一个O(n)操作,所以这个方法是O(n^2)。它可以通过简单地直接迭代 LinkedList 来缓解。

注意:这假定此方法位于您的 LinkedList class 中并且 Q 是列表的通用类型。