使用已排序的键添加链接列表中的元素

时间:2014-09-14 03:08:12

标签: java

我在下面给出了一段代码,用于在链接列表中按排序顺序添加元素及其键。但它没有根据键对它们进行排序,只是按其插入顺序添加。看起来,我错过了什么。

public void insert(int key, int value)
{
    Link pcurrent = pfirst;
    Link newLink = new Link(key, value);
    if(pcurrent != null)
    {
        while(pcurrent.key <= newLink.key && pcurrent.next != null)
        {
            pcurrent = pcurrent.next;
        }
        Link temp = pcurrent.next ;
        pcurrent.next = newLink;
        newLink.next = temp;
    }
    else
    {
        newLink.next = pfirst;
        pfirst = newLink;
    }
    System.out.println("After inserting element in the linked List");
    display();
}

3 个答案:

答案 0 :(得分:1)

让我们通过一个示例来了解如何修复代码。由于这些值不是算法的一部分,因此我将在下面的讨论中忽略它们。首先,假设我们已经有一个包含以下键的列表:

5 -> 42 -> 69

现在让我们分析一下调用list.insert(53, x);,它应该插入一个(key,value)对作为我们列表中的第三个元素。

从列表的开头开始。

    Link pcurrent = pfirst;

创建一个新节点。

    Link newLink = new Link(key, value);

确保我们不在列表的末尾。

    if(pcurrent != null)
    {

逐步浏览列表以找到应插入新链接的节点。请注意,我们必须非常小心这个循环。这里很容易出现一个错误。

        while(pcurrent.key <= newLink.key && pcurrent.next != null)
        {
            pcurrent = pcurrent.next;
        }

请注意,我们必须非常小心这个循环。这里很容易出现一个错误的错误。所以让我们更仔细地分析它。

在我们的示例中,pcurrent.key以值5开头,小于我们插入的53。此外,pcurrent.next不是null。所以我们转到下一个链接,其密钥为42。这仍然低于53pcurrent.next仍然不是null。所以我们再次转到下一个链接。现在pcurrent.next69。这不小于或等于53,因此循环终止。

        Link temp = pcurrent.next ;
        pcurrent.next = newLink;
        newLink.next = temp;

现在我们在69之后插入。哎呀!我们一个接一个。所以我们的循环不正确。

要解决此问题,我们需要另一个Link变量,称之为previous。然后你可以在previous之后插入,一切都应该没问题。

    Link pcurrent = pfirst;
    Link previous = null;    // Add this declaration

    Link newLink = new Link(key, value);
    if(pcurrent != null)
    {
        while(pcurrent.key <= newLink.key && pcurrent.next != null)
        {
            previous = pcurrent;     // Update previous
            pcurrent = pcurrent.next;
        }

        // insert newLink between previous and next
        previous.next = newLink;
        newLink.next = current;
    }

您还应该执行类似的分析,以插入空列表并插入列表的开头。请注意,调试器可以通过向您显示代码正在执行的操作来帮助您进行此分析。请确保您知道期望发生的事情。如果您对调试器显示的内容感到惊讶,那么您就知道存在问题。

答案 1 :(得分:0)

如果要在链接列表的开头插入元素,还需要首先更新内部的pFirst

假设您的初始链接是(10,5),并且您尝试插入的第二个链接是(12,6) 然后根据你的代码 pFirst将是L(10,5)

在第二次更新中,您的链接列表将如下所示     L(10,5) - &gt; L(12,6)

然后如果添加L(9,6) 它将变为L(10,5) - > L(9,6) - &gt; L(12,6)

 while(pcurrent.key <= newLink.key && pcurrent.next != null)
    {
        pcurrent = pcurrent.next;
    }

您的代码将在两种情况下从上方退出       1. pcurrent.next!= null,那么在那种情况下你接下来做的很酷       2.或者newLink.key&gt; pcurrent.key,在这种情况下newLink应该在pCurrent之前,这意味着你需要知道前一个元素

您的代码应如下所示

  Link previous = pFirst;
  while(pcurrent.key <= newLink.key && pcurrent.next != null)
    {
       previous = pCurrent; 
       pcurrent = pcurrent.next;
    }
    if( pcurrent.next == null){
        Link temp = pcurrent.next ;
        pcurrent.next = newLink;
        newLink.next = temp;
    }
    else{
        // Also check if previous == pcurrent 
        // then this element will go at beginning as this is the smallest one
        if(pCurrent == previous){
            newLink.next = previous;
            pFirst = newLink;
        }
        else{
          Link temp = previous.next ;
          previous.next = newLink;
          newLink.next = temp;
        }
     }

答案 2 :(得分:0)

正如@ code-apprentice所建议的那样:完全是混乱,因为有1个错误。 这是修复它的解决方案,希望有所帮助!

Singly Linked List in Java to add elements sorted according to keys and to find and delete an element from the linked List

由于