这是一个链表,其中pList指向包含值3
的节点pList
|
3 7 6 1 2 8 4 5 -> NULL
给定以下代码,在执行以下代码后重绘显示列表更改的列表。
pCur = pList;
while(pCur->next->next != NULL)
pCur = pCur->next;
pCur->next->next = pList;
pList = pCur -> next;
pCur -> next = NULL;
pCur = NULL;
以下是我对正在发生的事情的解释: pCur = pList(pCur = pList) | 3 7 6 1 2 8 4 5 - > NULL
pList pCur (pCur = pCur->next)
| |
3 7 6 1 2 8 4 5 -> NULL
pCur PList (pCur->next->next = pList)
| |
3 7 6 1 2 8 4 5 -> NULL
pCur pList (pList = pCur->next)
| |
3 7 6 1 2 8 4 5 -> NULL
(pCur->next = NULL)
3 7 6 1 2 8 -> NULL
我不相信这是正确的。我做错了什么?
答案 0 :(得分:2)
它实际上是做什么的:
我们从以下开始:
pCur = pList (pCur = pList)
|
3 7 6 1 2 8 4 5 -> NULL
然后我们将pCur向前移动,而pCur-> next-> next!= NULL,所以我们最终得到
pList pCur
| |
3 7 6 1 2 8 4 5 -> NULL
然后我们将列表的头部附加到尾部
pList pCur pList (again)
| | |
3 7 6 1 2 8 4 5 3 7 ....
这给了我们一个无限循环的列表。
然后我们将pList移动到指向pCur-> gt; next
pCur pList
| |
3 7 6 1 2 8 4 5 3 7 ....
如果我们移动它以便pList是第一个(我们可以这样做,因为它是无限循环的):
pList pCur pList (again)
| | |
5 3 7 6 1 2 8 4 5 3 7 ....
我们终于说pCur后面的内容是NULL,给我们:
pList pCur
| |
5 3 7 6 1 2 8 4 -> NULL
正如您所看到的,这样做的目的是将列表的最后一个元素移到前面。
答案 1 :(得分:0)
您省略了这些链接,因此无法显示pCur->next = NULL
的效果。此外,pCur->next->next = pList
设置pCur
,而非pList
。
以编程方式制作这些绘图非常容易:
void print_list(Link const *pCur, Link const *pList)
{
Link const *p;
printf("pCur -> ");
for (p = pCur; p != NULL && p != pList; p = p->next)
printf("%d -> ", p->data);
puts(p == NULL ? "NULL" : "pList");
printf("pList -> ");
for (p = pList; p != NULL && p != pCur; p = p->next)
printf("%d -> ", p->data);
puts(p == NULL ? "NULL" : "pCur");
}