由于某种原因,我对双链表的冒泡排序切断了列表的第一个节点
这是方法
public void sortStudentsAlphabeticallyByFirstName()
{
StudentNode unsorted = tail;
StudentNode current = header;
while(unsorted.prevNode() != null)
{
while(current != unsorted)
{
int result = (current.getFirstName()).compareToIgnoreCase(current.nextNode().getFirstName());
if(result > 0) //If in wrong order lexicographically
{
StudentNode temp = current;
StudentNode next = current.nextNode();
StudentNode previous = current.prevNode();
StudentNode nextNext = next.nextNode();
if (numberOfStudents() == 2)
{
current = current.nextNode();
current.setNext(temp);
temp.setPrev(current);
temp.setNext(null);
current.setPrev(null);
unsorted = temp;
}
else if(nextNext == null) //If at penultimate student therefore last comparison
{
current = current.nextNode();
current.setNext(temp);
temp.setPrev(current);
temp.setNext(null);
previous.setNext(current);
current.setPrev(previous);
unsorted = temp;
}
else if(previous == null) //if at beginning of student list
{
if(current.nextNode() == unsorted)
{
current = current.nextNode();
current.setNext(temp);
temp.setPrev(current);
temp.setNext(nextNext);
nextNext.setPrev(temp);
current.setPrev(null);
unsorted = temp; //swap unsorted back to correct position
}
else
{
current = current.nextNode();
current.setNext(temp);
temp.setPrev(current);
temp.setNext(nextNext);
nextNext.setPrev(temp);
current.setPrev(null);
}
}
else //else if in the middle of the list
{
if(current.nextNode() == unsorted)
{
current = current.nextNode();
current.setNext(temp);
temp.setPrev(current);
temp.setNext(nextNext);
nextNext.setPrev(temp);
previous.setNext(current);
current.setPrev(previous);
unsorted = temp;
}
else
{
current = current.nextNode();
current.setNext(temp);
temp.setPrev(current);
temp.setNext(nextNext);
nextNext.setPrev(temp);
previous.setNext(current);
current.setPrev(previous);
}
}
}
current = current.nextNode();
}
current = header;
unsorted = unsorted.prevNode();
}
}
有人能明白为什么当我尝试再次迭代列表时它会切断列表的开头吗?我已经使用了调试器,它似乎运行正常,但我无法弄清楚它为什么这样做。
如果有帮助的话,这也是迭代列表方法
public void itterateList()
{
StudentNode u = header;
while(u != null)
{
System.out.println(u.getFirstName()+" "+u.getSurname());
u = u.nextNode();
}
}
Here's the method
public void sortStudentsAlphabeticallyByFirstName()
{
StudentNode unsorted = tail;
StudentNode current = header;
while(unsorted.prevNode() != null)
{
while(current != unsorted)
{
int result = (current.getFirstName()).compareToIgnoreCase(current.nextNode().getFirstName());
if(result > 0) //If in wrong order lexicographically
{
StudentNode temp = current;
StudentNode next = current.nextNode();
StudentNode previous = current.prevNode();
StudentNode nextNext = next.nextNode();
if (numberOfStudents() == 2)
{
current = current.nextNode();
current.setNext(temp);
temp.setPrev(current);
temp.setNext(null);
current.setPrev(null);
unsorted = temp;
}
else if(nextNext == null) //If at penultimate student therefore last comparison
{
current = current.nextNode();
current.setNext(temp);
temp.setPrev(current);
temp.setNext(null);
previous.setNext(current);
current.setPrev(previous);
unsorted = temp;
}
else if(previous == null) //if at beginning of student list
{
if(current.nextNode() == unsorted)
{
current = current.nextNode();
current.setNext(temp);
temp.setPrev(current);
temp.setNext(nextNext);
nextNext.setPrev(temp);
current.setPrev(null);
unsorted = temp; //swap unsorted back to correct position
}
else
{
current = current.nextNode();
current.setNext(temp);
temp.setPrev(current);
temp.setNext(nextNext);
nextNext.setPrev(temp);
current.setPrev(null);
}
}
else //else if in the middle of the list
{
if(current.nextNode() == unsorted)
{
current = current.nextNode();
current.setNext(temp);
temp.setPrev(current);
temp.setNext(nextNext);
nextNext.setPrev(temp);
previous.setNext(current);
current.setPrev(previous);
unsorted = temp;
}
else
{
current = current.nextNode();
current.setNext(temp);
temp.setPrev(current);
temp.setNext(nextNext);
nextNext.setPrev(temp);
previous.setNext(current);
current.setPrev(previous);
}
}
}
current = current.nextNode();
}
current = header;
unsorted = unsorted.prevNode();
}
}
Can anyone see why it cuts off the beginning of the list when I try to iterate the list again? I've used the debugger and it seems to run like it should, but I can't work out why it's doing it.
Here's the iterate list method as well if it helps
public void itterateList()
{
StudentNode u = header;
while(u != null)
{
System.out.println(u.getFirstName()+" "+u.getSurname());
u = u.nextNode();
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您的代码的主要问题是 header 和 tail 从未更新。
尝试以下更简单的代码:
The main problem of your code is that header and tail get never updated.
Try the following simpler code: