Problem p02265 (C++) — buggy submission, verdict: Time Limit Exceeded

#define _CRT_SECURE_NO_WARNINGS

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <vector>

using namespace std;

class List {
public:
  class Node {
  public:
    Node(int value = 0) : value(value), next(nullptr), back(nullptr){};

    // 自分が消されるとき
    ~Node() {
      if (back != nullptr) {
        back->setNext(next); // 自分の後ろのポインタに次の相手を伝える
      }
      if (next != nullptr) {
        next->setBack(back); // 自分の先のポインタに、後ろの相手を伝える
      }
    };

    int value;

    void setNext(Node *ptr) { next = ptr; };
    void setBack(Node *ptr) { back = ptr; };
    Node *getNext() { return next; }
    Node *getBack() { return back; }

  private:
    Node *next;
    Node *back;
  };

  List() : first(nullptr), last(nullptr){};

  // 片付ける
  ~List() {
    Node *current = first;
    while (current != nullptr) {
      Node *target = current;
      current = current->getNext();
      delete (target);
    }
  }

  // 全ての要素を削除する
  void clear() {}

  // 先頭に要素を追加する
  void insert(int x) {
    Node *t = first;

    first = new Node(x); // 新しいノードを追加する
    first->setNext(t);   // 次ノードにさっきまでの先頭を指定

    if (t != nullptr) {
      t->setBack(first); // 旧先頭ノードの後ろに新しく追加したノードを指定
    }
    // これが最初の追加
    else {
      last = first;
    }
  }

  // 最初に見つかった要素を削除する
  void remove(int x) {

    Node *current = first;
    // 同値のものを探す
    while (current != nullptr) {

      // 見つかった
      if (current->value == x)
        break;

      current = current->getNext(); // 次のポインタを取得
    }

    if (current == nullptr)
      return; // 見つからなかった

    // 見つかった要素の削除
    if (current == first) {
      removeFirst();
    } else if (current == last) {
      removeLast(); // ラストに移譲する
    } else {
      delete (current);
    }
  }

  // 最初の要素を削除する
  void removeFirst() {
    Node *second = first->getNext();

    // 先頭の削除
    delete (first);

    // 旧2番手を先頭に設定
    first = second;
    // 消したのがlastでもあったのなら
    if (second == nullptr) {
      last = second;
    } // ラストも更新
  };

  // 最後の要素を削除する
  void removeLast() {
    Node *booby = last->getBack();

    // 最後尾の削除
    delete (last);

    // 旧ブービーを末尾に設定
    last = booby;

    // 消したのがfirstでもあったのなら
    if (booby == nullptr) {
      first = booby;
    } // 先頭も更新
  };

  // 入っている全ての要素を出力する
  void dump() {
    Node *current = first;
    int cnt = 0;
    while (current != nullptr) {
      if (cnt != 0)
        printf(" ");
      printf("%d", current->value);
      current = current->getNext();
      cnt++;
    }
    printf("\\n");
  }

private:
  Node *first;
  Node *last;
};

int N;
int main() {
  List list;

  cin >> N;

  for (int i = 0; i < N; i++) {
    char command[20];
    int n;

    scanf("%s%d", command, &n);

    if (command[0] == 'i') {
      list.insert(n);
    } else if (strlen(command) > 6) {
      if (command[6] == 'F') {
        list.removeFirst();
      } else if (command[6] == 'L') {
        list.removeLast();
      }
    } else {
      list.remove(n);
    }
  }

  list.dump();
  return 0;
}


Error: TLE

Fixed submission:

#define _CRT_SECURE_NO_WARNINGS

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <vector>

using namespace std;

class List {
public:
  class Node {
  public:
    Node(int value = 0) : value(value), next(nullptr), back(nullptr){};

    // 自分が消されるとき
    ~Node() {
      if (back != nullptr) {
        back->setNext(next); // 自分の後ろのポインタに次の相手を伝える
      }
      if (next != nullptr) {
        next->setBack(back); // 自分の先のポインタに、後ろの相手を伝える
      }
    };

    int value;

    void setNext(Node *ptr) { next = ptr; };
    void setBack(Node *ptr) { back = ptr; };
    Node *getNext() { return next; }
    Node *getBack() { return back; }

  private:
    Node *next;
    Node *back;
  };

  List() : first(nullptr), last(nullptr){};

  // 片付ける
  ~List() {
    Node *current = first;
    while (current != nullptr) {
      Node *target = current;
      current = current->getNext();
      delete (target);
    }
  }

  // 全ての要素を削除する
  void clear() {}

  // 先頭に要素を追加する
  void insert(int x) {
    Node *t = first;

    first = new Node(x); // 新しいノードを追加する
    first->setNext(t);   // 次ノードにさっきまでの先頭を指定

    if (t != nullptr) {
      t->setBack(first); // 旧先頭ノードの後ろに新しく追加したノードを指定
    }
    // これが最初の追加
    else {
      last = first;
    }
  }

  // 最初に見つかった要素を削除する
  void remove(int x) {

    Node *current = first;
    // 同値のものを探す
    while (current != nullptr) {

      // 見つかった
      if (current->value == x)
        break;

      current = current->getNext(); // 次のポインタを取得
    }

    if (current == nullptr)
      return; // 見つからなかった

    // 見つかった要素の削除
    if (current == first) {
      removeFirst();
    } else if (current == last) {
      removeLast(); // ラストに移譲する
    } else {
      delete (current);
    }
  }

  // 最初の要素を削除する
  void removeFirst() {
    Node *second = first->getNext();

    // 先頭の削除
    delete (first);

    // 旧2番手を先頭に設定
    first = second;
  };

  // 最後の要素を削除する
  void removeLast() {
    Node *booby = last->getBack();

    // 最後尾の削除
    delete (last);

    // 旧ブービーを末尾に設定
    last = booby;
  };

  // 入っている全ての要素を出力する
  void dump() {
    Node *current = first;
    int cnt = 0;
    while (current != nullptr) {
      if (cnt != 0)
        printf(" ");
      printf("%d", current->value);
      current = current->getNext();
      cnt++;
    }
    printf("\\n");
  }

private:
  Node *first;
  Node *last;
};

int N;
int main() {
  List list;

  cin >> N;

  for (int i = 0; i < N; i++) {
    char command[20];
    int n;

    scanf("%s%d", command, &n);

    if (command[0] == 'i') {
      list.insert(n);
    } else if (strlen(command) > 6) {
      if (command[6] == 'F') {
        list.removeFirst();
      } else if (command[6] == 'L') {
        list.removeLast();
      }
    } else {
      list.remove(n);
    }
  }

  list.dump();
  return 0;
}