所以我对链表如何工作以及它们如何在 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/