繁体   English   中英

需要有关Java代码的帮助

[英]Need help with Java code

我对链表有一些问题。 我正在使用来自随机类的随机对象生成40个随机整数,并将它们附加到链表中。 这也使用指定的种子。 减去此一个错误,一切正常。 在控制台/输出中打印的第一件事是带有随机生成的40个整数的链表。 然后,我尝试使用递减插入排序对列表进行排序,这是我认为我的错误所在的地方。 我对“减少插入排序算法”的尝试是在isdRecI和isdRecII方法中完成的,这些方法都是递归的(请注意,该程序的大部分都是递归的,因此,如果您不熟悉递归的注意事项)。 排序完成后,我要以降序再次打印链接列表。 请尝试使其尽可能简单,如果您喜欢我的代码风格,因为我有点像Java初学者,即请不要过于复杂。 如您所见,如果您编译我的代码,您将在已排序的打印物中看到重复项。 我的代码在下面列出。 我也很了解链接列表和插入排序的概念,但是我很难让代码以我想要的方式输出。 请随时修改我的方法。 感谢您的时间和贡献。

public class Node 
{

private int data = 0; 
Node next; 

public Node (int datax)  //constructor 
{
    data = datax; 
    next = null;
}

public int getData()  // get the data value
{
    return data;
}

public void setData(int datax) // sets the data value   
{
    data = datax ; 
}

public void print() // print node data on one line.
{
    System.out.print(data + "  ");
}

public Node getNext()
{
    return (next);
}

public void setNext(Node nextx)
{
    next = nextx; 
}
} 

import java.util.Random;

public class MySort 

{
Node head; 


/*
*  This method appends iteratively to the end of the linked list
*/
public void appendIter(int datax) 
{
    Node newNode = new Node(datax); 
    Node rightpointer = head; 
    if (rightpointer == null) 
    {
        head = newNode;
        return; 
    }
    else 
    {   
        while (rightpointer.getNext() != null) 
        {
            rightpointer = rightpointer.getNext(); 
        } 
        rightpointer.setNext(newNode);  

    }
}

/* 
 * This method passes the data to isdRecI
 */

        public void isRecI(MySort unsortedList)
    {
        isRecII(head);
    }

    public void isRecII(Node unsortedPointer)
    {
        int data;
        if(unsortedPointer == null)
        {
            return;
        }
        data = unsortedPointer.getData();
        isdRecI(data);
        isRecII(unsortedPointer.getNext());
    }


   /*
    * This method sorts the data using insert sort and sorts in decreasing order  
    * 
    */
    public void isdRecI(int dx)
    {
        head = isdRecII(head, dx);
    }

    public Node isdRecII(Node hp, int dx)
    {
        Node nxp;
        /*
        if(hp == null)
        {
            nxp = new Node(dx);  // commented out for testing purposes please uncomment if you need 
            return nxp;
        }
        */
       if(dx >=  hp.getData())    
        {   
            nxp = new Node(dx);
            nxp.setNext(hp);
            return nxp;
        }
        hp.setNext(isdRecII(hp.getNext(),dx));
        return hp;
    }

    /*
     * This method is an iterative print method for the linked list 
     */
    public void print()
    {
        System.out.println("print list start: ");
        Node nextrightpointer = head;
        while (nextrightpointer != null)
        {
            nextrightpointer.print();
            nextrightpointer = nextrightpointer.getNext();
        }
      System.out.println("print list end");
    }


    public static void main(String[] args)
{
    MySort SortObject = new MySort ();
    Random random = new Random(12345);

    for(int i=0; i < 40;i++)
        {
            SortObject.appendIter(random.nextInt(200));
        }

        SortObject.print();
        SortObject.isRecI(SortObject); 
        System.out.println();
        SortObject.print(); 

}
}

还包括输出:

打印列表开始:51 80 41 28 55 84 175 2 101 189 117 142 190 6 12 184 187 103 132 175 1 151 192 116 28 181 25 143 71 39 129 197 101 25 103 155 152 152 31 10 108打印列表结束

(排序后//这不只是供参考而已打印)

打印列表开始:197192190189187184181175175175155152151143142132129117116108103103101101 84 80 71 55 51 51 80 41 41 39 39 28 28 28 55 84 175 25 25 12 10 6 2 2 101 189 117 142 190 6 12 184 187 103 132 175 1 1 151 192 116 28 181 25 143 71 39 129 197 101 25 103 155 152 31 10 108打印列表末尾

您尝试实现哪种排序算法? 我建议您查看标准的排序算法(例如Bubblesortmergesort ),然后使其工作。 从您的描述来看,您似乎只是想出了自己的排序算法(不推荐)。 Java还具有内置的机制来帮助您对数据进行排序。 例如,您可以覆盖Node类上的compareTo方法,并在列表上调用Collections.sort()

您的问题是“ head”是指未排序的列表,但是在isdRecI方法中将其视为描述了已排序的列表。 isdRecI要做的第一件事是将一个新节点添加到列表中-因此该列表现在包含原始未排序列表以及一个新节点。

1)您有太多的递归函数。 一个主要功能和一个助手就足够了。 2)您调用将新值添加到列表中而不将其删除。 我将尝试修改递归函数,然后发布我所得到的内容。

这是我得到的新代码。 由于您未实现双链表,因此我必须做一些奶酪才能添加/删除。

public void isRecI(Node unsortedList)
{
    int data;
    if(unsortedList == null)
    {
        return;
    }
    Node prev = unsortedList;
    unsortedList = unsortedList.getNext(); //first element is in order
    while(unsortedList != null){
        reHelper(head , null , unsortedList , prev);
        prev = unsortedList;
        unsortedList = unsortedList.getNext();
    }
}

public void reHelper(Node inOrder , Node orderPrev , Node toInsert , Node insertPrev){
    if(inOrder == toInsert)return;
    if(inOrder.getData() < toInsert.getData()){
        insertPrev.setNext(toInsert.getNext()); //remove from list
        toInsert.setNext(inOrder);// first part of add to list
        if(orderPrev == null){
            head = toInsert; // make head
        }
        else{
            orderPrev.setNext(toInsert);// finish add to list
        }
        return;
    }
    reHelper(inOrder.getNext() , inOrder , toInsert , insertPrev);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM