试图理解如何在迭代地反转链表时修改列表

时间:2011-11-25 10:18:09

标签: c linked-list reverse member-function-pointers iteration

我有以下代码,它迭代地反转链表。

 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 个答案:

答案 0 :(得分:1)

不,我们不应该。

您不希望更改内存中节点的地址(这意味着更改它们的位置),而是它们如何相互指向,即:每个节点指向哪个节点,这是通过更改在这些行中发生的next

nextNode = currNode->next;
currNode->next = prevNode;

如果我们使用list **currNode,我应该说:

*nextNode = currNode->next;
*currNode->next = prevNode;

但这对我有什么好处?

我们只是改变节点之间的连接方式,每个节点的连接都是next,因此只应更改它们的值。

希望这足以澄清:)