1

我试图说明一个双向链表问题。这是我最近学习的一个旧测试。

问题如下:

在此代码之后绘制最终链接的内容:

ListNode n1 = new ListNode();
ListNode n2 = new ListNode();
ListNode n3 = n1;
n1.next = n2;
n3.prev = n1;
n1.next.prev = n3.next;

我迷路的地方是最后一行代码。

n1.next.prev = n3.next;

这是解决方案:

http://www.imagechicken.com/viewpic.php?p=1242322384048558300&x=jpg

任何人都可以引导我完成这个或引导我朝着一个好的方向前进吗?

4

5 回答 5

4

第一步:两个节点,没有链接。n1也称为n3

      +-------+下一个 +--------+下一个
      | +----> | +---->
  上一篇| n1 | 上一篇| n2 |    
 <----+ n3 | <----+ |   
      +-------+ +-------+   

第二步:n1.next = n2;

      +-------+下一个 +--------+下一个
      | +----------->| +---->
  上一篇| n1 | 上一篇| n2 |    
 <----+ n3 | <----+ |   
      +-------+ +-------+   

第三步:n3.prev = n1;
因为n3is n1,这会使箭头转向。

      +-------+下一个 +--------+下一个
      | +----------->| +---->
  上一篇| n1 | 上一篇| n2 |    
 /----+ n3 | <----+ |   
 \--->+-------+ +--------+   

第四步:n1.next.prev = n3.next;
记住n1.nextn2n3n1。按照箭头:

      +-------+下一个 +--------+下一个
      | +----------->| +---->
  上一篇| n1 | 上一篇| n2 |    
 /----+ n3 | /----+ |   
 \--->+-------+ \--->+--------+   

所以 和 的prev指针n1最终n2都指向自己。

于 2009-05-14T16:48:19.087 回答
3

这个关键是n1和n3指向同一个ListNode。

以下是 3 次操作后的状态:

n1.next = n2;
// n1.prev = null;
// n1.next = n2;
// n2.prev = null;
// n2.next = null;
// n3.prev = null;
// n3.next = n2;

n3.prev = n1;
// n1.prev = n1;
// n1.next = n2;
// n2.prev = null;
// n2.next = null;
// n3.prev = n1;
// n3.next = n2;

n1.next.prev = n3.next;
// n1.prev = n1;
// n1.next = n2;
// n2.prev = n2;
// n2.next = null;
// n3.prev = n1;
// n3.next = n2;

所以在最后一条语句中,n3.next与 相同n1.next,即n2。因此,最后一条语句等效于 settings n2.prev = n2

于 2009-05-14T16:43:56.163 回答
0

我会尝试画三个盒子。将每个框分成三份——三分之一用于标签,三分之一用于“上一个”,三分之一用于“下一个”。然后从所有“prev”和“next”绘制连接线到适当的标签,看看事情是如何联系起来的。

一张照片可以抵得上一千个字。

于 2009-05-14T16:43:26.507 回答
0

这种事情会让人感到困惑,直到你意识到 ListNode 只有两个实例;n1、n2 和 n3 都指的是这些实例。特别是n1、n2、n3的值只设置一次;由于 n3 的值设置为 n1,您可以在此代码中轻松地将 n3 替换为 n1,并且它的工作方式相同。

于 2009-05-14T16:45:53.927 回答
0

抱歉 - 无法在图片中做出正面或反面。

n1.next = n2。因此,n1.next.prev 评估为 n2.prev

n3 = n1。因此,n3.next 的计算结果为 n1.next。

您将 n2.prev 设置为 n1.next。

于 2009-05-14T16:47:54.203 回答