我对链表有点问题。我使用随机类中的随机对象生成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 31 10 108打印列表结束
(排序后//这不打印仅供参考)
打印列表开始: 197 192 190 189 187 184 181 175 175 155 152 151 143 142 132 129 117 116 108 103 103 101 101 84 80 71 55 51 51 80 41 41 39 31 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打印列表结束
答案 0 :(得分:0)
您尝试实施哪种排序算法?我建议您查看标准排序算法(例如bubblesort,mergesort),并使其正常工作。根据您的描述,您似乎只想出了自己的排序算法(不推荐)。 Java还内置了一些机制来帮助您对数据进行排序。例如,您可以覆盖Node类上的compareTo方法,并在列表中调用Collections.sort()。
答案 1 :(得分:0)
您的问题是“head”是指未排序的列表,但在isdRecI方法中,它被视为描述排序列表。首先,dRecI会向列表中添加一个新节点 - 因此列表现在包含原始未排序列表以及一个新节点。
答案 2 :(得分:0)
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);
}