双重链表例证

时间:2009-05-14 16:30:31

标签: linked-list

我试图说明一个双重链表问题。这是我最近一直在研究的旧测试。

问题如下:

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

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

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

5 个答案:

答案 0 :(得分:4)

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

      +-------+next        +-------+next
      |       +---->       |       +---->
  prev|   n1  |        prev|   n2  |    
 <----+   n3  |       <----+       |   
      +-------+            +-------+   

第二步:n1.next = n2;

      +-------+next        +-------+next
      |       +----------->|       +---->
  prev|   n1  |        prev|   n2  |    
 <----+   n3  |       <----+       |   
      +-------+            +-------+   

第三步:n3.prev = n1;
由于n3n1,因此会转动箭头。

      +-------+next        +-------+next
      |       +----------->|       +---->
  prev|   n1  |        prev|   n2  |    
 /----+   n3  |       <----+       |   
 \--->+-------+            +-------+   

第四步:n1.next.prev = n3.next;
请注意,n1.nextn2n3n1。按照箭头:

      +-------+next        +-------+next
      |       +----------->|       +---->
  prev|   n1  |        prev|   n2  |    
 /----+   n3  |       /----+       |   
 \--->+-------+       \--->+-------+   

因此prevn1的{​​{1}}指针最终都指向自己。

答案 1 :(得分: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.nextn1.next相同,即n2。因此,最后一个语句等同于设置n2.prev = n2

答案 2 :(得分:0)

我会尝试画三个盒子。将每个方框划分为三个 - 标签的三分之一,“prev”的三分之一,“next”的三分之一。然后将所有“prev”和“next”的连接线绘制到相应的标签上,以查看事物是如何链接的。

一张图片胜过千言万语。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

抱歉 - 无法从图片中删除头部或尾部。

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

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

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