C++ 反转给定节点之间的双链接列表

C++ 反转给定节点之间的双链接列表,c++,reverse,doubly-linked-list,C++,Reverse,Doubly Linked List,尝试反转链表元素,使其指向链表中给定节点的指针。 例如,我将得到一个指向链接列表中第4个节点的指针和一个指向第7个节点的指针,并且必须反转这些节点之间的节点。以下是一些不起作用的相关代码: template <class T> void List<T>::reverse( ListNode * & startPoint, ListNode * & endPoint ){ if (startPoint == NULL) return;

尝试反转链表元素,使其指向链表中给定节点的指针。 例如,我将得到一个指向链接列表中第4个节点的指针和一个指向第7个节点的指针,并且必须反转这些节点之间的节点。以下是一些不起作用的相关代码:

template <class T>
void List<T>::reverse( ListNode * & startPoint, ListNode * & endPoint ){

  if (startPoint == NULL)  
    return;

  if (startPoint->prev != NULL)
    startPoint->prev->next = endPoint;

  if (endPoint->next != NULL)
    endPoint->next->prev = startPoint;

  ListNode * curr = startPoint;
  ListNode * temp = startPoint;

  while(curr != endPoint)
  {
    temp = curr->next;
    curr->next = curr->prev;
    curr->prev = temp;
    curr = temp;
  }

  temp = endPoint->next;
  endPoint->next = endPoint->prev;
  endPoint->prev = temp; 

  temp = startPoint->next;
  startPoint->next = endPoint->next;
  endPoint->prev = startPoint->prev;

  temp = startPoint;
  startPoint = endPoint;
  endPoint = temp;

} 
模板
无效列表::反向(ListNode*&startPoint、ListNode*&endPoint){
如果(起始点==NULL)
返回;
如果(起点->上一步!=NULL)
起点->上一步->下一步=终点;
如果(端点->下一步!=NULL)
端点->下一步->上一步=起始点;
ListNode*curr=startPoint;
ListNode*temp=startPoint;
while(curr!=端点)
{
温度=当前->下一步;
当前->下一个=当前->上一个;
当前->当前=温度;
电流=温度;
}
temp=endPoint->next;
端点->下一个=端点->上一个;
端点->上一个=温度;
温度=开始点->下一步;
起点->下一步=终点->下一步;
端点->上一个=起点->上一个;
温度=起始点;
起点=终点;
终点=温度;
} 

这段代码可以编译,但不能正确执行反向节点,我不知道为什么。

我还没有尝试编写这段代码,但从算法上讲,这应该相当快

1) 首先,从子列表的开始和结束位置之间的所有节点交换
prev
next
的值。这将颠倒中间所有节点的顺序。只留下边缘节点

2) 在所有位置交换“下一个”和“上一个”后,还将原始起始节点中更新的“下一个”与原始结束节点中更新的“上一个”进行交换。现在,这些节点将指向序列的正确其余部分

3) 对于管理,还更新序列外部的节点以正确指向

示例(节点显示为“节点(上一个,下一个)”)

反向节点1-4(B-E)

第一步:

A(0,B) - B(C,A) - C(D,B) - D(E,C) - E(F,D) - F(E,-)
第二

第三

现在让我们想象一下秩序:

A(0,E) - E(A,D) - D(E,C) - C(D,B) - B(C,F) - F(B,-)

在这里,将中间的4个节点颠倒过来。

您能指出故障点吗?你得到了什么?这不是代码检查,您需要更具体。我相信这就是我的代码所做的,但是它无法正确地反转列表…这有点难读,如果您实际使用std::swap会更容易。但无论如何,你只做了第一步,而不是第二步和第三步。注意从B(C,A)&E(F,D)到B(C,F)&E(A,D)的机会
A(0,B) - B(C,F) - C(D,B) - D(E,C) - E(A,D) - F(E,-)
A(0,E) - B(C,F) - C(D,B) - D(E,C) - E(A,D) - F(B,-)
A(0,E) - E(A,D) - D(E,C) - C(D,B) - B(C,F) - F(B,-)