Java链表中字符串的合并排序
我有一个练习,我必须在链表中插入一个字符串。假设字符串如下所示:Java链表中字符串的合并排序,java,string,linked-list,mergesort,Java,String,Linked List,Mergesort,我有一个练习,我必须在链表中插入一个字符串。假设字符串如下所示: "Java Coding Is Great" great >> is >> java >> coding 合并排序后,链表应如下所示: coding >>> great >>> is >>> java. 问题在于,在我的合并排序代码中,我接收到以下内容: "Java Coding Is Great" great >>
"Java Coding Is Great"
great >> is >> java >> coding
合并排序后,链表应如下所示:
coding >>> great >>> is >>> java.
问题在于,在我的合并排序代码中,我接收到以下内容:
"Java Coding Is Great"
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();
}
合并方法
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));
}
请帮我弄清楚出了什么问题很遗憾,我不能使用第三个类,,也不能使用指向列表开头或结尾的指针。您可以使用调试器单步执行代码吗?这将帮助你找出问题所在。即使是几个放置得当的断点也会有所帮助 从一个只包含一个条目的列表开始:“Java”。看看会发生什么 然后尝试两项列表:“Java编码”。看看在这种情况下会发生什么
找出简单案例中发生的情况,然后再研究更复杂的案例。这里的问题有点滑稽 在我的构造器中,我在列表中插入的每个单词都有一个空格 我通过这个代码修正了:
s=text.substring(i+1,index);
而不是:
s=text.substring(i,index);
答案要归功于DevForum的NormR。不错,但我不喜欢您在WordNode中使用merge()的解决方案。一方面,您可以比较喜欢的每个节点,如下所示:
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);
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 n){
}
这已经很好了,但你可以通过减少更多的时间和空间竞争来做得更好,你可以将你的列表分成这样的赔率和均数
this._head = this.mergeSort(this._head);
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++;
}
当你把它放在一起,你会得到这样的东西(别忘了单词计数器)
现在剩下的就是像这样完成merge(),再次不要忘记单词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)));
}
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;
}
私有WordNode合并(WordNode L,WordNode R)
{
而(L!=null | | R!=null)
{
如果(L!=null&&R!=null)
if(L.getWord().compareTo(R.getWord())对同一个问题发布更多次不会帮助您找到答案。请删除其中一个,然后等待答案。@反斜杠-我在这里取得了真正的进步,因为代码几乎可以正常工作。感谢您的关注-我如何删除我以前的问题?不要删除它。请删除此问题,并用所有新的deta更新旧问题ils。@反斜杠,这没有任何意义。他为什么要删除这个新问题,因为这个问题实际被回答的概率要高得多。这可能只是一个拼写错误,但你有:This.\u head=This.\u head.mergeSort();
,但是你的mergeSort
方法需要一个WordNode
。现在尝试了一下……到目前为止还没有成功找到答案。可能还有其他想法吗?粗糙的解决方案,它没有找到问题的根源。在列表的开头添加一个虚假条目:“aaaaaaaaaaa”,排序,然后删除假条目。@Alan你怎么能在使用调试器时找不到任何东西?你是否尝试过使用它,并意识到你现在不知道如何使用它?不想表现得粗鲁,但它一定帮助你找到了一些东西…@Steve P。也许问题出在头上-它一直回到链接列表的末尾r合并,我就是不明白为什么。@rossum-这可能行得通,但我必须仔细查看所有列表,对吗?我认为这可能行得通,但正如你所建议的那样-不会找到问题的根源。