以下是在双向链表的开头添加的代码:
public void insertFirst(long dd) // insert at front of list
{
Link newLink = new Link(dd); // make new link
if( isEmpty() ) // if empty list,
last = newLink; // newLink <-- last
else
first.previous = newLink; // newLink <-- old first
newLink.next = first; // newLink --> old first
first = newLink; // first --> newLink
}
我不明白为什么当isEmpty()
和last
first
列表分配给newLink
时?那么它是不是会像这样,例如3->3
(只是一个数字为3
的例子)。我真的很困惑为什么他们都被分配到新节点。
答案 0 :(得分:0)
获得一张纸和一支笔,你就会理解。
如果您有一个空列表TabLayout
,则在调用[]
时会发生以下情况:
insert(dd)
答案 1 :(得分:0)
newLink
会被绑定到first
,因为您的其他内容没有阻止({
... }
),因此只有first.previous = newLink
会有条件地执行,以下陈述将是无条件的。
请注意,在两种情况下,您实际上都希望first
指向newLink
,否则您将无法从开始迭代到达它。
答案 2 :(得分:0)
我将答案分成两个合乎逻辑的理由,其中一个或两个将回答您的疑问。
1)现在就回答你的问题&#34;当将数字插入空列表时,我们为什么要将第一个节点声明为head
&amp; tail
&#34;
在第二回合插入数字时会有很多歧义。 下一个数字是否会先插入?还是最后?或者在特定的位置?以下代码片段将回答您的问题,
Line 1: insertFirst(3); //Sets Node containing 3 as both head and tail. No magic tricks
现在可以调用以下任一功能,具体取决于用户的选择:
a) Line 2: insertFirst(4);
//Sets Node containing 4 as head and the previous head(3) as it's dual link.
//Notice that there is no need to update the tail as Node containing 3 is already a tail.
b) Line 2: insertLast(4);
//Sets Node containing 4 as tail and the previous tail(3) as it's dual link.
//Notice that there is no need to update the head as Node containing 3 is already a head.
这样,通过将第一个节点指定为head
和tail
,可以轻松实现即将出现的歧义。
2)首先,它是一个双重链接列表,而不是循环链接列表,正如您在问题single node(3)
中所显示的那样3<>3
将head
和tail
描述为单个节点。请注意,head
和tail
都引用包含值 3 的相同Node对象。在创建双向链接列表时,您不必在头部和尾部之间设置任何链接,反之亦然。
DLL中的双向链接以双面角括号的形式直观地表示如下:
head<>node1<>node2<>node3<>tail
请注意,head和tail,都不与DLL中的任何链接相关联。如果这部分回答你的疑问,问题本身就有一个缺陷。但是如果你想进一步询问如何在圆形列表中保持显示节点的轨迹,请使用size
变量,该变量在每个函数的调用时自行更新。