C++ 如何访问c++;? 我需要解决以下问题:“删除中间节点:实现删除中间节点的算法(LE,任何节点,但 单链表的第一个和最后一个节点(不一定是中间节点),只允许访问 那个节点。 例子 输入:链表a->b->c->d->e->f中的节点c 结果:没有返回任何内容,但是新的链表看起来像a->b->d->e->f”

C++ 如何访问c++;? 我需要解决以下问题:“删除中间节点:实现删除中间节点的算法(LE,任何节点,但 单链表的第一个和最后一个节点(不一定是中间节点),只允许访问 那个节点。 例子 输入:链表a->b->c->d->e->f中的节点c 结果:没有返回任何内容,但是新的链表看起来像a->b->d->e->f”,c++,struct,linked-list,singly-linked-list,C++,Struct,Linked List,Singly Linked List,现在,这就是我试图实现的解决方案: “在此问题中,您无权访问链接列表的标题。您只能访问该节点。”。 解决方案只是将数据从下一个节点复制到当前节点,然后删除 下一个节点。“

现在,这就是我试图实现的解决方案: “在此问题中,您无权访问链接列表的标题。您只能访问该节点。”。 解决方案只是将数据从下一个节点复制到当前节点,然后删除 下一个节点。“


<如何在C++中编写,只有迭代器和NEXT()方法?我只需要在一个节点上执行一个操作,而不需要遍历整个列表,所以我肯定遗漏了什么。。。c++的迭代器让我这样解决吗?

很简单。该函数可以按以下方式显示

// The structure definition is only for exposition.
struct Node
{
    int value;
    Node *next;
};

void delete_middle( Node *node )
{
    Node *tmp = node->next;

    node->value = node->next->value;
    node->next  = node->next->next;

    delete tmp;
}
它不会根据您的描述检查
节点
是否指向列表的第一个或最后一个节点

一个删除中间节点的算法(LE,<强>任意节点,但是 单个节点的第一个和最后一个节点(不一定是正中间) 链表

如果您使用的是迭代器,那么可以按照以下方式定义函数。假设迭代器的类型定义为
list::iterator

void delete_middle( list::iterator it )
{
    auto next = std::next( it );

    it->value = next->value;
    it->next  = next->next;

    delete next;
}
但这取决于迭代器的定义方式

c++的迭代器让我这样解决吗

否,擦除功能将需要对节点成员进行低级别访问,例如数据和下一个。一个“标准C++迭代器”没有迭代器::您可以创建自己的自定义迭代器类,特定于单个链表类。您可以在自定义迭代器类中包含get和set函数,以便访问元素的下一个指针(我不确定这是否违反了使用迭代器的意图)。我假设取消迭代器(*迭代器)将被用来访问数据,与“标准C++迭代器”相同。 STL有一个std::list::erase(std::list::iterator)函数,但它对列表(容器)和迭代器(容器元素的迭代器)都具有低级访问权限


后续-指针和迭代器之间的差异。对于指针,取消引用指针将访问指针指向的任何对象,而取消引用迭代器仅访问迭代器指向的元素的数据部分。以双链接列表元素为例:

    struct Node
    {   // list node
        Node * Next;      // ptr to next node
        Node * Prev;      // ptr to prev node
        long   Data;      // data
    };

    *pointer_to_node  ... // accesses entire struct

    *iterator_to_node ... // equivalent to pointer_to_node->Data

恐怕你问得太早了。在这一点上,我能给出的最好的建议是画大量的图片,以帮助您形象化列表在每次操作之前、期间和之后的外观。在列表操作的每个阶段,您需要对图片进行的更改与代码必须执行的操作类似。更好的是,当需要调试时,您将不得不进行调试,您将有一组图片可以与调试器一起使用,以帮助发现程序偏离预期的地方-通常是错误。您知道链表通常是如何定义的吗?你知道那是什么吗?是否有,您可以提供?删除了stl标记,因为它与stl无关。@Jarod42“您可以将值从一个节点复制到另一个节点。”这正是问题中所述的内容,问题中提供了这一点:“解决方案只是将数据从下一个节点复制到当前节点,然后删除下一个节点。”OP询问“如何访问下一个节点”。您至少应该发布提供的节点结构。您目前编写的代码。@rcgldr指针是一种迭代器。:)这个问题现在回答起来有点太混乱,但最终结果可能是这样的。很抱歉,这是不正确的。指针是迭代器的一种类型,它是完成此任务所需的全部。将值从下一个节点复制到当前节点,然后删除下一个节点。就这么简单。@ĴošWilliard-看看,数据可以通过延迟访问,迭代器可以复制到另一个迭代器,迭代器可以升级,但没有迭代器::erase()函数。可以使用类似于迭代器的东西,但不使用C++ STL迭代器。一般来说,这个答案是正确的。即使指针是迭代器的一种类型,但如果您有一个STL容器,将其内容弄乱将首先消除使用容器的所有封装好处。这显然只是一个没有标准容器的练习。如果OP使用的是STL,那就太好了,但他不是。不,这并不意味着他使用的是STL迭代器类。你假设这可能是因为你不想相信指针本身就是迭代器。