我在下面给出了一段代码,用于在链接列表中按排序顺序添加元素及其键。但它没有根据键对它们进行排序,只是按其插入顺序添加。看起来,我错过了什么。
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();
}
答案 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
。这仍然低于53
且pcurrent.next
仍然不是null
。所以我们再次转到下一个链接。现在pcurrent.next
是69
。这不小于或等于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个错误。 这是修复它的解决方案,希望有所帮助!
由于