您好我在双链表上执行冒泡排序时遇到问题。冒泡排序适用于不同的列表类型,所以我假设它是正确的。但是,当我在双链表上使用它时,我最终得到了一个未分类的混乱和重复的节点。我在双链表类中使用add和remove方法排序,所以我认为其中一个或两个必定是错误的。无论如何这里是我的代码,任何帮助将不胜感激。
我的添加方法,我根据索引
的值从头部或尾部遍历列表public void my_add_element(int index, T element) throws myException{
if(index <= num_items && index > -1)
{
if (index == num_items){
myNode<T> nodeAtEnd = new myNode<T>(element);
nodeAtEnd.setLeft(tail);
nodeAtEnd.setRight(null);
if(tail != null)
tail.setRight(nodeAtEnd); //link the list
tail = nodeAtEnd; //now the tail is the new node i added
if(head == null) // if the list has no elements then set the head
head = nodeAtEnd;
num_items++;
}
else
{
myNode<T> current;
myNode<T> nodeToInsert = new myNode<T>(element);
if(index <= Math.round(num_items/2))
{
current = this.head;
for(int i = 0; i < index; i++)
{
current = current.getRight();
}
if(current.getLeft() == null)
{
this.head = nodeToInsert;
nodeToInsert.setRight(current);
current.setLeft(nodeToInsert);
num_items++;
}
else
{
current.getLeft().setRight(nodeToInsert);
nodeToInsert.setLeft(current.getLeft());
nodeToInsert.setRight(current);
current.setLeft(nodeToInsert);
num_items++;
}
}
else
{
current = this.tail;
for(int i = 0; i < (num_items-(index+1)); i++)
{
current = current.getLeft();
}
current.getLeft().setRight(nodeToInsert);
nodeToInsert.setLeft(current.getLeft());
nodeToInsert.setRight(current);
current.setLeft(nodeToInsert);
num_items++;
}
}
}
else
throw new myException("Invalid Index. The ADT does not have such an Index Position");
}
我的删除方法,同样
public void my_remove_element(int index) throws myException{
if(index < num_items)
{
myNode<T> current;
if(index <= Math.round(num_items/2))
{
current = this.head;
for(int i = 0; i < index; i++)
{
current = current.getRight();
}
if(current.getLeft() == null)
this.head = current.getRight();
else
{
current.getRight().setLeft(current.getLeft());
current.getLeft().setRight(current.getRight());
}
num_items--;
}
else
{
current = this.tail;
for(int i = 0; i < (num_items-(index+1)); i++)
{
current = current.getLeft();
}
if(current.getRight() == null)
this.tail = current.getLeft();
else
{
current.getRight().setLeft(current.getLeft());
current.getLeft().setRight(current.getRight());
}
num_items--;
}
}
//2.2. If the index is a wrong one
else
throw new myException("Invalid Index. The ADT does not have such an Index Position");
}
我的冒泡排序,项目是一个列表,可以是几种不同类型的列表,例如arrayList,linkedList,doubleLinkedList。冒泡排序适用于arrayList和LinkedList。
public void bubble_sort(){
for (int i = 0; i < items.my_get_length()-1; i++)
for (int j = 0; j < ((items.my_get_length() - 1) - i); j++)
{
if (items.my_get_element(j+1).smaller(items.my_get_element(j))) {
items.my_add_element(j+2, items.my_get_element(j));
items.my_remove_element(j);
}
}
}
项目包含足球运动员详细信息列表(名称,得分目标)。 这是我使用的列表。
姓名:鲁尼,目标:30
姓名:Ibrahimovic,进球:46
姓名:梅西,进球:80
姓名:阿圭罗,进球:21
姓名:罗纳尔多,进球:89
姓名:穆勒,目标:33
姓名:Lewandowski,目标:30
这就是冒泡排序后的样子
姓名:Ibrahimovic,进球:46
姓名:梅西,进球:80
姓名:Ibrahimovic,进球:46
姓名:Ibrahimovic,进球:46
姓名:Lewandowski,目标:30
姓名:鲁尼,进球:30
姓名:阿圭罗,进球:21
答案 0 :(得分:0)
更新
大家好,我想通了。在索引为0或=到num_items
的情况下,我的remove方法没有更新指针