试图了解如何在迭代反转链表时修改列表
Posted
技术标签:
【中文标题】试图了解如何在迭代反转链表时修改列表【英文标题】:Trying to understand how list gets modified while iteratively reversing a linked list 【发布时间】:2011-11-25 10:18:09 【问题描述】:我有以下代码迭代地反转一个链表。
struct list
int elem;
list *next;
;
/* .... */
void ReverseListIterative(list **listref)
list *currNode = *listref;
list *prevNode = NULL;
list *nextNode = NULL;
while(currNode)
*listref = currNode;
nextNode = currNode->next;
currNode->next = prevNode;
prevNode = currNode;
currNode = nextNode;
在代码中,currNode、prevNode 和 nextNode 都是 ReverseListIterative() 的本地指针。为什么原始列表仍然被修改(更准确地说是颠倒了)?我们不应该使用
list **currNode;
list **prevNode;
list **nextNode;
以便修改列表节点的实际地址?
【问题讨论】:
【参考方案1】:不,我们不应该。
您不想更改内存中节点的地址(这意味着更改它们的位置),而是它们如何指向彼此,即:每个节点指向哪个节点,这是由更改在这些行中发生的next
:
nextNode = currNode->next;
currNode->next = prevNode;
如果我们使用list **currNode
,我应该说:
*nextNode = currNode->next;
*currNode->next = prevNode;
但这对我有什么好处?
我们只是改变了节点之间的连接方式,每个节点的连接都是next
,所以只需要改变它们的值。
希望这已经足够澄清了:)
【讨论】:
我问了同样的问题。我们可以更改节点内的信息,其中包括指针变量下一个包含的地址。以上是关于试图了解如何在迭代反转链表时修改列表的主要内容,如果未能解决你的问题,请参考以下文章