Нужна помощь с кодом Java - PullRequest
       6

Нужна помощь с кодом Java

0 голосов
/ 05 апреля 2011

У меня небольшая проблема со связанным списком. Я генерирую 40 случайных целых, используя случайный объект из случайного класса и добавляю их в связанный список. Это также использует указанное семя. Все отлично работает без этой ошибки. Первое, что печатается в консоли / выводе, это связанный список со случайно сгенерированными 40 дюймами. Затем я пытаюсь отсортировать список, используя сортировку по убыванию, в которой, как мне кажется, и заключается моя ошибка. Моя попытка "уменьшения алгоритма сортировки вставок" делается в методах isdRecI и isdRecII, они рекурсивные (будьте осторожны, большие части этой программы рекурсивны, поэтому, если вы не знакомы с рекурсией, остерегайтесь) После завершения сортировки я хочу снова напечатать связанный список в порядке убывания. Пожалуйста, постарайтесь сделать его как можно более простым, и если вам нравится мой стиль кода, так как я начинающий Java, то есть, пожалуйста, не усложняйте его. Как вы можете видеть, если вы скомпилируете мой код, вы увидите дубликаты в отсортированном виде. Мой код указан ниже. Я также хорошо понимаю концепцию связанного списка и сортировки вставки, но мне не хватает времени, чтобы заставить код выводить так, как я хочу. Пожалуйста, не стесняйтесь изменять мои методы. Спасибо за ваше время и вклад.

public class Node 
{

private int data = 0; 
Node next; 

public Node (int datax)  //constructor 
{
    data = datax; 
    next = null;
}

public int getData()  // get the data value
{
    return data;
}

public void setData(int datax) // sets the data value   
{
    data = datax ; 
}

public void print() // print node data on one line.
{
    System.out.print(data + "  ");
}

public Node getNext()
{
    return (next);
}

public void setNext(Node nextx)
{
    next = nextx; 
}
} 

import java.util.Random;

public class MySort 

{
Node head; 


/*
*  This method appends iteratively to the end of the linked list
*/
public void appendIter(int datax) 
{
    Node newNode = new Node(datax); 
    Node rightpointer = head; 
    if (rightpointer == null) 
    {
        head = newNode;
        return; 
    }
    else 
    {   
        while (rightpointer.getNext() != null) 
        {
            rightpointer = rightpointer.getNext(); 
        } 
        rightpointer.setNext(newNode);  

    }
}

/* 
 * This method passes the data to isdRecI
 */

        public void isRecI(MySort unsortedList)
    {
        isRecII(head);
    }

    public void isRecII(Node unsortedPointer)
    {
        int data;
        if(unsortedPointer == null)
        {
            return;
        }
        data = unsortedPointer.getData();
        isdRecI(data);
        isRecII(unsortedPointer.getNext());
    }


   /*
    * This method sorts the data using insert sort and sorts in decreasing order  
    * 
    */
    public void isdRecI(int dx)
    {
        head = isdRecII(head, dx);
    }

    public Node isdRecII(Node hp, int dx)
    {
        Node nxp;
        /*
        if(hp == null)
        {
            nxp = new Node(dx);  // commented out for testing purposes please uncomment if you need 
            return nxp;
        }
        */
       if(dx >=  hp.getData())    
        {   
            nxp = new Node(dx);
            nxp.setNext(hp);
            return nxp;
        }
        hp.setNext(isdRecII(hp.getNext(),dx));
        return hp;
    }

    /*
     * This method is an iterative print method for the linked list 
     */
    public void print()
    {
        System.out.println("print list start: ");
        Node nextrightpointer = head;
        while (nextrightpointer != null)
        {
            nextrightpointer.print();
            nextrightpointer = nextrightpointer.getNext();
        }
      System.out.println("print list end");
    }


    public static void main(String[] args)
{
    MySort SortObject = new MySort ();
    Random random = new Random(12345);

    for(int i=0; i < 40;i++)
        {
            SortObject.appendIter(random.nextInt(200));
        }

        SortObject.print();
        SortObject.isRecI(SortObject); 
        System.out.println();
        SortObject.print(); 

}
}

Также включая вывод:

начало списка печати: 51 80 41 28 55 84 175 2 101 189 117 142 190 6 12 184 187 103 132 175 1 151 192 116 28 181 25 143 71 39 129 197 101 25 103 155 152 31 10 108 конец списка печати

(после сортировки // это не печатается только к вашему сведению)

начало печати списка: 197 192 190 189 187 184 181 175 175 155 152 151 143 142 132 129 117 116 108 103 103 101 101 84 80 71 55 51 51 80 41 41 39 31 28 28 28 55 84 175 25 25 12 10 6 2 2 101 189 117 142 190 6 12 184 187 103 132 175 1 1 151 192 116 28 181 25 143 71 39 129 197 101 25 103 155 152 31 10 108 конец списка печати

Ответы [ 3 ]

0 голосов
/ 05 апреля 2011

Ваша проблема в том, что «head» относится к несортированному списку, но в методе isdRecI он обрабатывается так, как если бы он описывал отсортированный список. Первое, что делает isdRecI, это добавляет новый узел в список - так что теперь список содержит исходный несортированный список плюс новый узел.

0 голосов
/ 05 апреля 2011

1) У вас слишком много рекурсивных функций.Одной основной функции и одного помощника должно быть достаточно.2) Вы звоните, чтобы добавить новое значение в список, не удаляя его.Я попытаюсь подправить рекурсивные функции и опубликовать то, что я получаю.

Вот новый код, который я получил.Поскольку вы не внедрили двусвязный список, мне пришлось добавить немного сыра, чтобы добавить / удалить.

public void isRecI(Node unsortedList)
{
    int data;
    if(unsortedList == null)
    {
        return;
    }
    Node prev = unsortedList;
    unsortedList = unsortedList.getNext(); //first element is in order
    while(unsortedList != null){
        reHelper(head , null , unsortedList , prev);
        prev = unsortedList;
        unsortedList = unsortedList.getNext();
    }
}

public void reHelper(Node inOrder , Node orderPrev , Node toInsert , Node insertPrev){
    if(inOrder == toInsert)return;
    if(inOrder.getData() < toInsert.getData()){
        insertPrev.setNext(toInsert.getNext()); //remove from list
        toInsert.setNext(inOrder);// first part of add to list
        if(orderPrev == null){
            head = toInsert; // make head
        }
        else{
            orderPrev.setNext(toInsert);// finish add to list
        }
        return;
    }
    reHelper(inOrder.getNext() , inOrder , toInsert , insertPrev);
}
0 голосов
/ 05 апреля 2011

Какой алгоритм сортировки вы пытаетесь реализовать?Я бы рекомендовал взглянуть на стандартный алгоритм сортировки (например, bubblesort , mergesort ) и заставить его работать.Из вашего описания, похоже, вы только что придумали собственный алгоритм сортировки (не рекомендуется).Java также имеет встроенные механизмы, которые помогут вам сортировать ваши данные.Например, вы можете переопределить метод compareTo в своем классе Node и вызвать Collections.sort () в своем списке.

...