在列表的开头添加混淆

时间:2015-10-22 15:27:34

标签: java doubly-linked-list

以下是在双向链表的开头添加的代码:

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的例子)。我真的很困惑为什么他们都被分配到新节点。

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.

这样,通过将第一个节点指定为headtail,可以轻松实现即将出现的歧义。

2)首先,它是一个双重链接列表,而不是循环链接列表,正如您在问题single node(3)中所显示的那样3<>3headtail描述为单个节点。请注意,headtail都引用包含值 3 的相同Node对象。在创建双向链接列表时,您不必在头部和尾部之间设置任何链接,反之亦然。

DLL中的双向链接以双面角括号的形式直观地表示如下:

head<>node1<>node2<>node3<>tail

请注意,head和tail,都不与DLL中的任何链接相关联。如果这部分回答你的疑问,问题本身就有一个缺陷。但是如果你想进一步询问如何在圆形列表中保持显示节点的轨迹,请使用size变量,该变量在每个函数的调用时自行更新。