2011-11-25 50 views
0

我有以下代码迭代地反转链接列表。试图了解如何迭代地反转链接列表时修改列表

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

希望这是足够澄清:)

+0

我想出了同样的事情,一旦我问这个问题。我们可以在节点内更改信息,其中包括指针变量下一个包含的地址。 – curryage