c++ - 什么时候修改链表?

标签 c++ c list linked-list

所以我对链表如何工作以及它们如何在 C++ 中保持引用感到有点困惑。

例如,我有一个列表,比如说myList,我想打印它的项目。
我从学校知道我必须将我的列表复制到另一个列表以在打印过程后保持 myList 相同。

Node* n;
n = myList;
while(n)
{
    printf("%d ",n->val);
    n=n->next;
}

好的,所以我在另一个列表 n 中有一个 myList 的拷贝(具有相同的指针)。 在我循环遍历 n 之后,myList 是相同的,但具有与 n 相同的指针。

如果 n 改变了,为什么 myList 没有改变(相同的指针,对吧?)?

现在如果我说:

Node* n;
n = myList;
n->next = NULL;//or n->next=another node -doesn t matter

现在在第二个例子中 myList 也被改变了。

你能给我解释一下吗?

最佳答案

我认为您对实际列表结构和对列表结构的引用之间的区别有些困惑。

在你的第一个例子中,关于遍历列表,你在遍历之前基本上有这种情况,你有两个对同一个列表的引用:

o-->o-->o-->o-->o-->NULL
^
|
 \_ myList, n

遍历列表后看起来像这样:

o-->o-->o-->o-->o-->NULL
^                   ^
|                   |
 \_ myList           \_ n

如果您没有复制对列表头部的引用来遍历它,那么遍历后您将得到这样的结果:

o-->o-->o-->o-->o-->NULL
                    ^
                    |
                     \_ myList

因为您不再有指向列表头部的指针,所以您无法访问该列表。

在你的第二个例子中,你有这个:

o-->o-->o-->o-->o-->NULL
^
|
 \_ myList, n

然后你把它变成这样:

  _________________
 /                 \
o   o-->o-->o-->o-->NULL
^
|
 \_ myList, n

这种转换改变了列表的实际结构,这将反射(reflect)在对该列表的所有引用中。

关于c++ - 什么时候修改链表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14163856/

相关文章:

c++ - 使编译器假设所有情况都在没有默认情况下的开关中处理

c++ - 双重释放或损坏错误 - valgrind

c - asprintf() : how to free the pointers?

list - 当字典更改时,列表中的所有字典都会更改其值

c++ - 如何将值转换为 vector

c++ - 为模板类的实例分配唯一的数字标识符

c - 二叉树——通过代码追踪

c++ - 从一个变量的位到另一个变量的有效映射

python:遍历字符串列表查找指定元素的索引

java - 如何从 List<> 中删除项目?