【问题标题】:Trying to understand how list gets modified while iteratively reversing a linked list试图了解如何在迭代反转链表时修改列表
【发布时间】:2011-11-25 10:18:09
【问题描述】:

我有以下代码迭代地反转一个链表。

 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;

以便修改列表节点的实际地址?

【问题讨论】:

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


    【解决方案1】:

    不,我们不应该。

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

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

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

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

    但这对我有什么好处?

    我们只是改变了节点之间的连接方式,每个节点的连接都是next,所以只需要改变它们的值。

    希望这已经足够澄清了:)

    【讨论】:

    • 我问了同样的问题。我们可以更改节点内的信息,其中包括指针变量下一个包含的地址。
    猜你喜欢
    • 2014-09-17
    • 2020-07-28
    • 2017-12-05
    • 2013-11-09
    • 1970-01-01
    • 2018-10-12
    • 2019-04-04
    相关资源
    最近更新 更多