c++中复杂度为0(1)的单链表操作
Singly Linked List operations in C++ with complexity O(1)
我需要制作一个可以进行三次操作的链表。这三个操作的复杂度必须为0(1)。
所讨论的操作是:
- 添加到尾部
- 从头部删除
- 返回中间节点
使用的节点结构如下:
struct node {
int data;
node* link;
node(int input) {
data = input;
link = NULL;
}
};
对于删除头部,我通过仅使用对头部节点的通常引用实现了O(1)
if (head != NULL) {
if (head->link == NULL) {
delete head;
head = NULL;
tail = NULL;
}
else {
node* temp = head;
head = head->link;
delete temp;
}
}
对于添加到尾部,我通过对尾部节点
的引用实现了O(1) if(head != NULL) {
tail->link = new node(input);
tail = tail->link;
}
else {
head = new node(input);
tail = head;
}
我的问题是返回中间节点。我知道如何通过遍历列表来做到这一点,但这意味着它的复杂度是0 (n)我的主要想法是,如果我保持对中间节点当前位置的引用,我就可以随时跟踪它。这适用于Add to tail函数,因为我可以将中间节点向前移动。它不起作用,然而,删除头部,因为没有办法我可以继续移动中间引用向后,因为它必须是一个单链表。
我确信可以在0(1)内完成此操作,并且已经暗示可以这样做的原因是因为这是列表将经历的仅有的三个操作,因此中间节点可以遵循一个模式。
我想不出任何方法可以做到这一点,除非保持对从头部到中间节点的每个节点的引用作为最小值,但是已经被告知我不需要这样做来实现O(1)。
它不起作用,然而,删除头部,因为我无法继续向后移动中间引用
还好你不用把中间向后移动!删除头部只能使中间向前。
相关文章:
- 如何找到2个单链表的公共节点
- 对单链表的混淆
- 编写一个函数来删除单链表中的节点(尾部除外),仅授予对该节点的访问权限
- 在单链表前面添加一个节点后,我无法遍历每个节点
- 具有完整五法则的简单链表
- 在 C++ 中实现简单链表时出现问题,没有输出
- 在析构函数中删除单链表的正确方法是什么?
- 移动语义 c++ 单链表
- C++中最接近 Lua 表操作的东西是什么?
- 单链表时间
- 带有unique_ptr的通用单链表,MS visual studio C++中存在未知错误
- 使用 std::unique_ptr 的通用单链表,Visual Studio C++ Microsoft中存在未知的反
- 在 "CodePad" 中执行链表操作时转储的核心(这是一个在线C++编译器)
- 删除单链表列表
- 在单链表中的后端插入节点
- 合并单链表上的排序
- 简单链表与下一个>下一个交换
- 我试图键入一个函数来在单链表的末尾添加一个节点,但不起作用
- 单链表分配问题 (nullptr)
- c++中复杂度为0(1)的单链表操作