我在 JAVA 中创建了一个程序,用于向LinkedList
添加元素,并在添加元素时对其进行排序。我在排序时使用的交换技术类似于将节点添加到LinkedList的开头时使用的技术。该技术适用于后一种情况,但未能在前者中运行。我不明白为什么这不起作用。以下是我的代码供您参考。
//Node class
class Node{
int d; Node link;
Node(int d){
this.d = d;
link = null;
}
}//Node
//LinkedList class
class LL{
Node start;
LL(){
start = null;
}
//method to add and sort the nodes
//in ascending order of the values of 'd' of the nodes
void insert(Node nd){
if(start==null){
start = nd;
}
else{
Node temp = start;
while(temp!=null){
if(nd.d<=temp.d){
Node t2 = temp;
temp = nd;
nd.link = t2;
break;
}
temp = temp.link;
}
}
}//insert
//method to display nodes of the LinkedList
void display(){
Node temp = start;
do{
System.out.print(temp.d + " ");
temp = temp.link;
}while(temp!=null);
}//display
}//LL
//Main class
class LL_Test{
public static void main(String[] args){
LL myLL = new LL();
myLL.insert(new Node(5));
myLL.insert(new Node(2));
myLL.insert(new Node(7));
myLL.insert(new Node(6));
myLL.insert(new Node(1));
myLL.display();
}//main
}//LL_Test
预期输出:1 2 5 6 7
获得的输出:5
答案 0 :(得分:2)
除了第一个元素之外,你永远不会在列表中添加元素。 (temp = nd;
未将上一个节点的链接设置为nd
)。您需要跟踪上一个节点并在元素之前添加新节点,然后在第一个节点大于您想要的节点之前
void insert(Node nd) {
Node temp = start;
Node previous = null;
while (temp != null && temp.d < nd.d) {
previous = temp;
temp = temp.link;
}
// insert node
if (previous == null) {
// insert at start
nd.link = start;
start = nd;
} else {
// insert somewhere in the middle
nd.link = temp;
previous.link = nd;
}
}//insert
答案 1 :(得分:1)
两条评论,均适用于insert()
循环内的start != null
,while(temp!=null)
:
temp.d <= nd.d
和 temp.link==null
或{的节点为止{1}}。temp.link.d >= nd.d
中while
循环的正文中,设置insert
,以便新节点指向另一个节点。但是,您没有设置nd.link
或类似的东西来将新节点挂钩到从temp.link=nd
开始的链中。答案 2 :(得分:1)
我对此的看法:
void insert ( Node nd )
{
Node temp = start;
Node previous = null;
while ( temp != null )
{
if ( nd.d <= temp.d )
{
nd.link = temp;
if ( nd.d < start.d )
{
start = nd;
}
break;
}
previous = temp;
temp = temp.link;
}
if( previous != null )
{
previous.link = nd;
}
if( start == null )
{
start = nd;
}
}