[英]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打印列表末尾
您尝试实现哪种排序算法? 我建议您查看标准的排序算法(例如Bubblesort , mergesort ),然后使其工作。 从您的描述来看,您似乎只是想出了自己的排序算法(不推荐)。 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.