我有下面的代码,迭代地反转一个链表。
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;
不,我们不应该。
您不想更改内存中节点的地址(这意味着更改它们的位置),而是要更改它们彼此指向的方式,即:每个节点指向哪个节点,这是通过更改next
来完成的,这发生在这些行中:
nextNode = currNode->next;
currNode->next = prevNode;
如果使用list **currNode
,我应该说:
*nextNode = currNode->next;
*currNode->next = prevNode;
但这对我有什么好处呢?
我们只改变节点之间的连接方式,每个节点的连接是next
,所以只需要改变它们的值。
希望我说的够清楚了:)