我试图说明一个双重链表问题。这是我最近一直在研究的旧测试。
问题如下:
在此代码之后绘制最终链接的内容:
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
任何人都可以引导我完成这个或引导我朝着一个好方向前进吗?
答案 0 :(得分:4)
第一步:两个节点,没有链接。 n1
也称为n3
。
+-------+next +-------+next | +----> | +----> prev| n1 | prev| n2 | <----+ n3 | <----+ | +-------+ +-------+
第二步:n1.next = n2;
+-------+next +-------+next | +----------->| +----> prev| n1 | prev| n2 | <----+ n3 | <----+ | +-------+ +-------+
第三步:n3.prev = n1;
由于n3
为n1
,因此会转动箭头。
+-------+next +-------+next | +----------->| +----> prev| n1 | prev| n2 | /----+ n3 | <----+ | \--->+-------+ +-------+
第四步:n1.next.prev = n3.next;
请注意,n1.next
为n2
,n3
为n1
。按照箭头:
+-------+next +-------+next | +----------->| +----> prev| n1 | prev| n2 | /----+ n3 | /----+ | \--->+-------+ \--->+-------+
因此prev
和n1
的{{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.next
与n1.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。