双链接列表的添加方法(冒泡排序)

时间:2016-03-26 22:29:09

标签: java list add bubble-sort

您好我在双链表上执行冒泡排序时遇到问题。冒泡排序适用于不同的列表类型,所以我假设它是正确的。但是,当我在双链表上使用它时,我最终得到了一个未分类的混乱和重复的节点。我在双链表类中使用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

1 个答案:

答案 0 :(得分:0)

更新

大家好,我想通了。在索引为0或=到num_items

的情况下,我的remove方法没有更新指针