查找链接列表的中间元素

时间:2013-07-10 14:20:31

标签: algorithm linked-list

我在书中遇到了链接列表中的问题,但我无法理解它想说的是什么?

是的:1. finding middle element but looking from starting。这些行意味着什么:

n is c????

LinkedListNode next = n.next;   // next= d;
6 n.data = next.data;  // n.data=d;
7 n.next = next.next; // c.next= e ??? 

我无法得到它,你能看看并告诉我吗?

  

实现一种算法,删除单个链表中间的节点,只允许访问该节点。

     

例:
  输入:链接列表中的节点“c”a-> b-> c-> d-> e
  结果:未返回任何内容,但新链接列表看起来像a-> b-> d-> e

     

解决方案:
  只需将数据从下一个节点复制到此节点,然后删除下一个节点   注意:如果要删除的节点是链接列表中的最后一个节点,则无法解决此问题。没关系 - 你的面试官想看到你指出这一点。在这种情况下,您可以考虑将其标记为虚拟。这是您应该与面试官讨论的问题。

1 public static boolean deleteNode(LinkedListNode n) {
2   if (n == null || n.next == null) {
3     return false; // Failure
4   }
5   LinkedListNode next = n.next;
6   n.data = next.data;
7   n.next = next.next;
8   return true;
9 }

在这里,可能是n?你能解释第5,6,7行吗?另外,如果n是最后一个元素,为什么它不起作用?

我是链接列表的新手。我正在阅读它的所有例子,但真的被困在这个。

2 个答案:

答案 0 :(得分:1)

问题要求您只在引用要删除的节点的情况下从链接列表中间删除节点。

  

在这里,可能是什么?

n可以是对链表中任何“中间”节点的引用,即不是第一个或最后一个节点。

  

你能解释第5,6,7行吗?

问题是,由于列表没有双重链接,因此您无法删除给定的节点而不会破坏链接列表(前一个节点将指向null)。

e.g。如果我们要删除c,b指向哪里?

A-> B-> C-> D-&GT,E

A-> B-> D-&GT,E

由于我们不知道c之前有什么节点,我们无法再次链接列表。因此解决方案是将值从d复制到节点c,然后删除节点d。然后列表不会中断,您已从中删除了一个节点。然后,旧节点c实际上将代表d节点,该节点将继续节点e处的链表。

A-> B-> C-> D-&GT,E

A-> B-> D-&GT,E

这些行只是从节点d复制数据并将其存储在节点c中,这样就可以删除节点d。

  

如果n是最后一个元素,为什么它不起作用?

如果n是最后一个元素,则列表中的下一个节点为空,因此我们无法将任何内容复制到当前节点中。

答案 1 :(得分:0)

您指出的行正在执行以下操作:

n.data = next.data;

从下一个节点复制数据;

n.next = next.next;

更改“now”节点的下一个链接;现在,当前节点是“下一个”节点的相同副本,并且无法从列表头部到达下一个节点。

换句话说,该算法实际上并不删除当前节点 - 它将数据从下一个节点复制到当前节点,并从链接链中删除下一个节点,因此当前节点上的数据丢失,并且当前节点作为下一个节点,下一个节点被有效删除。

如果当前节点是最后一个节点,则next.data将抛出NullPointerException。