我正在解决一个与链表相关的问题,我写了一些代码,工作得很好,但我无法分析我的代码的空间复杂度。这就是问题所在,你已经得到了一个整数的单链表以及两个整数,“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个虚拟节点会不会使它成为线性空间复杂度,因为它们就像一个链表。请解释一下!
有两个空间复杂度指标:总空间复杂度和辅助(额外)空间复杂度。
总计包括输入,而辅助不包括。
在您的情况下,输入大小为O(n),您正在使用O(1)额外空间对其进行修改。修改后,输入仍然是O(n)。这里n
表示列表的大小。
这转化为O(n)总空间复杂度和O(1)辅助空间复杂度。