我的代码的 space 复杂度是多少? (链表)

What is the space complexity of my code? (Linked List)

我正在解决一个与链表相关的问题,我写了一些工作得很好的代码,但我无法分析我的代码的 space 复杂性。这就是问题所在,你已经得到了一个整数的单链表以及两个整数,'M,' 和 'N.' 遍历链表,这样你就可以保留 'M'节点,然后删除下一个 'N' 个节点。以此类推,直到链表结束。

我写了这段代码来解决这个问题。

Node *skipMdeleteN(Node *head, int M, int N) {
  if (head == NULL) return head;
  if (M == 0) return NULL;
  if (N == 0) return head;
  Node *current = head;
  Node *dummy1 = new Node(-1);
  Node *dummy2 = new Node(-1);
  Node *FinalHead;
  Node *dummy2Head;
  Node *prev;
  int i = 0;
  int j = 0;
  int Head = 0;
  while (current != NULL) {
    if (i <= M - 1) {
      dummy1->next = current;
      dummy1 = dummy1->next;
      if (Head == 0) {
        FinalHead = dummy1;
        Head++;
      }
    }
    if (i >= M && i <= ((M + N) - 1)) {
      dummy2->next = current;
      dummy2 = dummy2->next;
      if (j == 0) {
        dummy2Head = dummy2;
        j++;
      }
    }
    if (i == ((M + N) - 1)) {
      i = 0;
    } else {
      i++;
    }
    current = current->next;
  }
  dummy1->next = NULL;
  dummy2->next = NULL;
  dummy1 = dummy1->next;
  dummy2 = dummy2->next;
  while (dummy2Head != NULL) {
    prev = dummy2Head;
    dummy2Head = dummy2Head->next;
    delete (prev);
  }
  return FinalHead;
}

此代码运行良好,代码背后的逻辑如下:

我创建了 2 个虚拟节点(dummy1 和 dummy2),然后我开始遍历链表,对于前 M 个节点,我继续将这些节点附加到 dummy1 节点的末尾。完成 M 个节点后,我开始在 dummy2 节点的末尾附加下一个 N 个节点,我将在最后删除该节点。因此,这会将我想保留的所有 M 节点附加到 dummy1 列表的末尾,其头部 I return.

我的代码的时间复杂度是O(N),因为我是遍历列表。我不确定 space 复杂度是多少,使用 2 个虚拟节点是否会使它成为线性 space 复杂度,因为它们就像一个链表。请解释!

有两个 space complexity 指标:总 space 复杂度和辅助(额外)space 复杂度。

总计包括输入,辅助不包括。

在你的例子中,输入大小是 O(n),你正在修改它,使用 O(1) extra space。修改后,输入仍然是 O(n)。这里 n 表示列表的大小。

这转化为 O(n) 总 space 复杂度和 O(1) 辅助 space 复杂度。