什么时候链接列表被修改?

Ser*_*oiu 2 c c++ linked-list list

所以我对链表如何工作以及如何在C++中保留引用感到困惑.

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

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

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

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

现在,如果我说:

Node* n;
n = myList;
n->next = NULL;//or n->next=another node -doesn t matter
Run Code Online (Sandbox Code Playgroud)

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

你能解释一下吗?

Gor*_*ley 9

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

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

o-->o-->o-->o-->o-->NULL
^
|
 \_ myList, n
Run Code Online (Sandbox Code Playgroud)

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

o-->o-->o-->o-->o-->NULL
^                   ^
|                   |
 \_ myList           \_ n
Run Code Online (Sandbox Code Playgroud)

如果你没有复制对列表头部的引用来遍历它,那么在遍历之后你会得到这个:

o-->o-->o-->o-->o-->NULL
                    ^
                    |
                     \_ myList
Run Code Online (Sandbox Code Playgroud)

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

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

o-->o-->o-->o-->o-->NULL
^
|
 \_ myList, n
Run Code Online (Sandbox Code Playgroud)

你把它变成了这个:

  _________________
 /                 \
o   o-->o-->o-->o-->NULL
^
|
 \_ myList, n
Run Code Online (Sandbox Code Playgroud)

这种转换会改变列表的实际结构,这将反映在对该列表的所有引用中.