C++ 为什么这两个不同的反向双链表?

C++ 为什么这两个不同的反向双链表?,c++,algorithm,data-structures,doubly-linked-list,C++,Algorithm,Data Structures,Doubly Linked List,要反转双链接列表,这两个代码之间有什么区别? 这与更改下一个和上一个指针不一样吗 void reverse(Node **head_ref) { Node *temp = NULL; Node *current = *head_ref; while (current != NULL) { temp = current->prev; current->prev = current->next;

要反转双链接列表,这两个代码之间有什么区别? 这与更改下一个和上一个指针不一样吗

void reverse(Node **head_ref) 
{ 
    Node *temp = NULL; 
    Node *current = *head_ref; 

    while (current != NULL) 
    { 
        temp = current->prev; 
        current->prev = current->next; 
        current->next = temp;             
        current = current->prev; 
    } 

    if(temp != NULL ) 
        *head_ref = temp->prev; 
} 

void reverse(Node **head_ref) 
{ 
    Node *temp = NULL; 
    Node *current = *head_ref; 

    while (current != NULL) 
    { 
        temp = current->next;
        current->next; = current->prev; 
        current->prev = temp;             
        current = current->next; 
    } 

    if(temp != NULL ) 
        *head_ref = temp->next;
} 

交换两个引用时,确实可以选择从哪个引用开始,即复制到
temp
变量的引用

因此,以下两段代码成功实现了交换:

    temp = current->prev; 
    current->prev = current->next; 
    current->next = temp;             
和(如果您删除分号,则有一半):

但是,第二个代码块应该像第一个代码块一样继续。您必须遵循
prev
链接(与交换之前一样,它是
下一个
链接)。因此,在第二个版本中,您应该更改:

    current = current->next; 
致:

但是,第二个代码中的问题是,在每次迭代结束时,您的
temp
引用等于
当前的
引用,并且在循环退出时将为空。因此,在循环退出后,无法正确设置头指针


因此,您应该坚持使用第一个版本。

执行交换的顺序并不重要,只要您最终反转了所有节点。这是否有一个单一的根节点,如环形结构,或头和尾是分开的?第一个反向方法可能从末尾开始,通过将当前节点设置为前一个节点来反转列表。第二种反向方法则相反;可能从列表的开头开始,并将当前节点设置为下一个节点。无论您以何种方式反转列表,结果都是一样的。第二种方法以错误的方向遍历列表,因此它将不起作用。如果你从尾而不是头开始,它会起作用。考虑使用现有的C++和。读一个好的…从现有的开源C++项目中得到灵感,比如,,这回答了你的问题吗?你能给我反馈吗?
    current = current->next; 
    current = current->prev;