我有以下代码,它迭代地反转链表。
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;
以便列表节点的实际地址被修改?
答案 0 :(得分:1)
不,我们不应该。
您不希望更改内存中节点的地址(这意味着更改它们的位置),而是它们如何相互指向,即:每个节点指向哪个节点,这是通过更改在这些行中发生的next
:
nextNode = currNode->next;
currNode->next = prevNode;
如果我们使用list **currNode
,我应该说:
*nextNode = currNode->next;
*currNode->next = prevNode;
但这对我有什么好处?
我们只是改变节点之间的连接方式,每个节点的连接都是next
,因此只应更改它们的值。
希望这足以澄清:)