C语言 试图理解列表如何被修改,而迭代地反转一个链表



我有下面的代码,迭代地反转一个链表。

 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,所以只需要改变它们的值。

希望我说的够清楚了:)

相关内容

  • 没有找到相关文章

最新更新