提问者:小点点

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


我正在解决一个与链表相关的问题,我写了一些代码,工作得很好,但我无法分析我的代码的空间复杂度。这就是问题所在,你已经得到了一个整数的单链表以及两个整数,“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个节点,我将在最后删除这些节点。因此,这会附加所有我想保留在dummy1列表末尾的M个节点,我返回其头部。

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


共1个答案

匿名用户

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

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

在您的情况下,输入大小为O(n),您正在使用O(1)额外空间对其进行修改。修改后,输入仍然是O(n)。这里n表示列表的大小。

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