我有一个练习,我必须在链表中插入一个字符串。假设字符串如下所示:
"Java Coding Is Great"
在合并排序之后,链表应该是这样的:
coding >>> great >>> is >>> java.
问题是在我的合并排序代码中,我收到以下内容:
great >> is >> java >> coding
所有的单词都被排序,但第一个单词(原始列表的头部)不是。
我有两个类:TextList和WordNode。
WordNode类有两个属性:
String _word; WordNode _next; //an address to the next link
TextList类只有一个属性:链接列表头的地址:
WordNode _head;
我有一个构造函数,在其中我将字符串随机插入到一个链表中。最后,它开始合并列表。此算法适用于此练习。
public TextList(String text){
String s=""; int index=text.length();
//we will stop at the end of the String.
for (int i=text.length()-1; i>=0; i--){
//if we reached a space, insert each string in appropriate order,
//the first word is the head of the string and last word points to null.
if (!(text.charAt(i)>='a' && text.charAt(i)<='z')){
s=text.substring(i,index);
_head=new WordNode(s,_head);
s="";
index=i;
}
if (i==1){
s=text.substring(i-1,index);
_head=new WordNode(s,_head);
}
}
//start merge sotring the list.
this._head=this._head.mergeSort();
}
合并排序方法:合并排序、合并和拆分:(这些在WordNode类中):
合并排序方法
public WordNode mergeSort(){
return mergeSort(this);
}
private WordNode mergeSort(WordNode h){
// Sort h by recursively splitting and merging
if (h==null || h._next==null)
return h;
else{
WordNode evens=h.splitOdds();
WordNode odds=h.splitEvens();
return mergeSort(odds).merge(mergeSort(evens));
}
}
合并方法
private WordNode merge(WordNode h){
//method merges this's list with h's list
//if h is null, just return this.
if (h==null){
return this;
}
if (this._word.compareTo(h._word)<0){
if (this._next==null)
return new WordNode(this._word,h);
else
return new WordNode(this._word,this._next.merge(h));
}
else
return new WordNode (h._word, merge(h._next));
}
拆分方法:一种用于偶数位置,一种用于奇数位置。
private WordNode splitOdds(){
boolean flag=true;
WordNode odds=null;
WordNode ptr=this;
while (ptr!=null){
if(flag)
odds=new WordNode(ptr._word,odds);
ptr=ptr.getNext();
flag=!flag;
}
return odds;
}
//MUST BE INITILIZED ON HEAD
private WordNode splitEvens(){
boolean flag=true;
WordNode evens=null;
WordNode ptr=this._next;
while (ptr!=null){
if (flag)
evens=new WordNode(ptr._word,evens);
ptr=ptr.getNext();
flag=!flag;
}
return evens;
}
请帮我找出问题所在。不幸的是,我不能使用第三个类,也不能使用指向列表开头或结尾的指针。
很好,但我不喜欢你在WordNode中合并()的解决方案。一方面,您可以比较喜欢的每个节点,如下所示:
this._word.compareTo(h._word);
但是在这种情况下,merge()和split()都是私有的,所以我认为更好的方法是在不重载的情况下将它们放入TextList和mergeSort()中。无论何时添加节点,都需要对链表中的所有节点进行排序,而不仅仅是其中的一部分。这就是为什么
this._head = this._head.mergeSort();
还有这个
public WordNode mergeSort(){
return mergeSort(this);
}
在WordNode中看起来没用
另一方面,如果你调用mergeSort进入如下文本列表
this._head = this.mergeSort(this._head);
并将排序合并到文本列表中的这个
public WordNode mergeSort(WordNode n){
}
它已经更好了,但是你可以做得更好,通过减少更多的时间和空间复杂性,你可以像这样把你的列表分成偶数和偶数
int counter = 1; // nodes counter helps to know if the current node is odd or even
WordNode L = null, // odd nodes
R = null; // even nodes
while(h != null)
{
if(counter%2 == 0)
R = new WordNode(h.getWord(), R, h.getWordCounter());
else
L = new WordNode(h.getWord(), L, h.getWordCounter());
//
h = h.getNext();
counter++;
}
当你把它放在一起,你会得到这样的东西(别忘了单词计数器)
public WordNode mergeSort(WordNode h){
int counter = 1; // nodes counter helps to know if the current node is odd or even
WordNode L = null, // odd nodes
R = null; // even nodes
while(h != null)
{
if(counter%2 == 0)
R = new WordNode(h.getWord(), R, h.getWordCounter());
else
L = new WordNode(h.getWord(), L, h.getWordCounter());
//
h = h.getNext();
counter++;
}
return merge(mergeSort(L), (mergeSort(R)));
}
现在剩下的就是像这样完成merge(),再次不要忘记单词计数器
private WordNode merge(WordNode L, WordNode R)
{
while(L != null || R != null)
{
if(L != null && R != null)
if(L.getWord().compareTo(R.getWord()) <= 0)
return new WordNode(L.getWord(), merge(L.getNext(), R), L.getWordCounter());
else
return new WordNode(R.getWord(), merge(L, R.getNext()), R.getWordCounter());
else if(L != null)
return new WordNode(L.getWord(), merge(L.getNext(), R), L.getWordCounter());
else if(R != null)
return new WordNode(R.getWord(), merge(L, R.getNext()), R.getWordCounter());
}
return null;
}
向罗森斯坦教授问好;-)
这里的问题有点好笑。
在我的构造器中,我在列表中插入的每个单词都有一个空格。
我用这个代码修正了这个问题:
s=text.substring(i+1,index);
而不是:
s=text.substring(i,index);
DevForum的NormR给出了答案。
你能用你的调试器一步完成你的代码吗?这将帮助你找出问题所在。即使是几个合理设置的断点也会有所帮助。
从一个只包含一个条目的列表开始:“Java”。看看会发生什么。
然后尝试两项列表:“Java编码”。看看在这种情况下会发生什么。
找出简单案例中发生的事情,然后处理更复杂的案例。
我想使用java实现只使用链表而不使用任何数组的合并排序。但我陷入了一个逻辑错误;我的代码消除了一些输入并对剩余部分进行排序。我应用了三个类:
合并排序通常是对链表排序的首选方式。链表缓慢的随机访问性能使得一些其他算法(如quicksort)表现不佳,而另一些算法(如heapsort)则完全不可能。我一直在努力在链表上做归并排序。它不断返回一个错误。我正在提供我试图执行的代码。请一定要帮我。它不断给出运行时错误。
我一直在尝试在我正在开发的程序中实现各种类型的排序。到目前为止,我已经成功地对整数进行了排序。为了使这个(合并)代码排序为字符串数组而不是整数数组,需要做哪些更改?时间复杂度会变化吗?如果是这样,是好是坏? 编辑1:尝试使用比较器。有些事情似乎不对劲。返回错误,例如无法从字符串转换为int,反之亦然。固定的 编辑2:我在if(数组[low].compareTo(数组[high])行得到NullPo
我在名为的类中有一个链表,它包含以下属性: 我有另一个类,它是“实际列表”,它只包含对列表头部的引用,这个类被称为“文本列表”,它接收一个字符串,并假设将该字符串的每个单词排序在列表中。例如,对于句子: 链接列表如下所示: 箭头就像指向列表中下一个节点的指针。 我想先把所有的单词放在一个链表中(类),然后做一个MERGE SORT来对链表中的单词进行排序。 我想做的是采用拆分方法将列表拆分为两个列
//我怎样才能实现这个功能?我想合并两个未排序的链表。
我试图借助单链表编写合并排序,节点定义如下, 合并排序的工作方式如下: i、 将未排序的列表划分为n个子列表,每个子列表包含1个元素(1个元素的列表被视为已排序)。 二、。重复合并子列表以生成新排序的子列表,直到只剩下1个子列表。这将是排序列表。代码如下所示。 我像这样打入会电话, 结果是,所有负值似乎都消失了。这里有什么问题?