【问题标题】:Reversing Portions of a Doubly Linked Linked (c++)反转双向链接的部分(c ++)
【发布时间】:2017-10-10 03:08:13
【问题描述】:

我正在尝试纠正一种反转双向链表的方法。

template <class T>
void List<T>::reverse() {
  reverse(head_, tail_);
}

template <class T>
void List<T>::reverse(ListNode*& startPoint, ListNode*& endPoint) {
  if(startPoint == NULL || endPoint == NULL) return;

  ListNode* currPoint = *&startPoint;
  ListNode* end = endPoint->next;

  while(currPoint != end ) {
    ListNode* tmp = currPoint->next;
    currPoint->next = currPoint->prev;
    currPoint->prev = tmp;

    if(tmp == end) {
      endPoint = startPoint;
      startPoint = currPoint;
    }

    currPoint = tmp;
  }
}

所以,head_tail_ 是指向 DLL 开头和结尾的指针。反转列表的实际过程应该相当简单 - 反转序列中每个 ListNode 的 prevnext 指针。

如您所见,我正在尝试使第二种方法可以反转 DLL 的任何子部分。我将在其他方法中使用第二种方法,但现在我唯一的目标是让它用于反转整个列表。我认为最大的问题是head_ 没有得到适当的更新,因为我打印列表时没有任何内容。

当我打印我相当基本的测试时,它只是显示:

Expected:   < 9 8 7 6 5 4 3 2 1 0 >
Actual:     < >

一个实现在实际输出中显示“9”,但我相当肯定这是因为列表的第一部分被简单地丢弃了。

【问题讨论】:

  • 使用调试器单步调试你的程序,看看你的代码哪里出错了。
  • @PaulMcKenzie 我设置了一个断点并逐步执行该函数,但所有 gdb 显示的是列表的内存地址而不是列表中的值,所以我实际上无法告诉它正在执行。
  • ListNode* currPoint = *&amp;startPoint; 不应该是ListNode* currPoint = *startPoint;
  • 另外,您是否首先尝试在没有任何参数的情况下将整个链表反转给 reverse 函数?换句话说,整个链表的普通反转?如果你不能编写那个函数,那么尝试编写一个通用的反转不会很好。如果您确实编写了这样一个函数,那么除了两个参数之外,该函数与您向我们展示的函数有什么区别?
  • 您还应该看到startNodeprevnextendNodenextprev 发生了什么变化。理想情况下,应该有另一个变量存储 start = startNode-&gt;prev 。所以最后,你做if(start !==NULL) start-&gt;next = endNodeif(end != NULL) end-&gt;prev = startNode

标签: c++ loops linked-list doubly-linked-list


【解决方案1】:

您可以将问题简化为三个步骤:

  1. 存储起点的prev和终点的next,并使其指向nullptr。
  2. 使用与全长链表相同的方法反转子列表。
  3. 将反向子列表的开始和结束节点与步骤 1 中存储的值连接。

这边

[prev] startpoint  ... endpoint [nxt]

[prev]   (nullptr) startpoint... endpoint (nullptr)   [nxt]

[prev]   (nullptr) reverse(startpoint...endpoint) (nullptr)   [nxt]

[prev] begin(reversed-sublist) ...end(reversed-sublist)  [nxt]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-25
    • 2011-03-18
    • 1970-01-01
    • 2018-03-05
    • 2015-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多