gpt4 book ai didi

Java排序链表打印两次

转载 作者:行者123 更新时间:2023-11-30 02:44:26 27 4
gpt4 key购买 nike

我正在编写一个程序,它将接收一组数据,对其进行处理并在链接列表中对其进行排序。我的问题是,当我查看输出时,当我的 (myList.retrieve(0, 20));第一次调用方法时,它会打印应有的两倍。第二次删除2个元素后,输出正确。

public class Lab9Tester {
public static void main(String args[]){
int testData[] = {5, 2, 7, 8, 3, 6, 10, 2, 6};
int numberOfElementsDeleted = 0;
SortedListOfInt myList = new SortedListOfInt();
for (int i = 0; i < testData.length; i++){
myList.addElement(testData[i]);
}
System.out.println("The values in the sorted list are given below");
System.out.println(myList.retrieve(0, 20));
System.out.println("The values in the sorted list between 4 and 7 are given below");
System.out.println(myList.retrieve(4, 7));
numberOfElementsDeleted = myList.deleteElement(6);
System.out.println("Number of deleted elements is " + numberOfElementsDeleted);
System.out.println("The values in the sorted list after deleting all elements with value 6 are given below");
System.out.println(myList.retrieve(0, 20));

}
}

我的测试程序,运行时我期望输出:

The values in the sorted list are given below
2 2 3 5 6 6 7 8 10
The values in the sorted list between 4 and 7 are given below
5 6 6 7
Number of deleted elements is 2
The values in the sorted list after deleting all elements with value 6 are given below
2 2 3 5 7 8 10

但是第一行值被打印两次

2 2 3 5 6 6 7 8 10 2 2 3 5 6 6 7 8 10 

我的其他类(class)如下:

public class SortedListOfInt {

ListGeneral myList = new ListGeneral();

private boolean needToRestart = true;
private boolean restartFlag = false;

public void addElement(int x){

if(myList.listIsEmpty())
{
myList.addAfterCurrent(x);
return;
}


if (myList.endOfList())
{
myList.addBeforeCurrent(x);
myList.restart();
return;
}


if (myList.currentValue() != null){
int currentValue = (int) (myList.currentValue());
if(currentValue >= x)
{
myList.addBeforeCurrent(x);
myList.restart();
}
else if(currentValue < x)
{
myList.getNextNode();
addElement(x);
}
}
}


public String retrieve(int lowerLimit, int upperLimit)
{

if(myList.listIsEmpty())
{
return "";
}

if(myList.endOfList() && needToRestart)
{
myList.restart();
needToRestart = false;
return "" + retrieve(lowerLimit, upperLimit);
}
if(myList.endOfList())
{
needToRestart = true;
return "";
}

int currentValue = (int) (myList.currentValue());

if(currentValue >= lowerLimit && currentValue <= upperLimit)
{

String result =currentValue + " " ;
myList.getNextNode();
return result + retrieve(lowerLimit,upperLimit);
}
else
{
myList.getNextNode();
return retrieve(lowerLimit,upperLimit);
}
}

public int deleteElement(int x)
{
repointToStart();

int currentValue;
if(myList.endOfList())
{
restartFlag = false;
return 0;
}
else
{
currentValue = (int) myList.currentValue();
if(currentValue == x)
{
myList.removeCurrent();
return deleteElement(x) + 1;
}
else
{
myList.getNextNode();
return deleteElement(x);
}
}

}

private void repointToStart()
{
if(restartFlag == false)
{
myList.restart();
restartFlag = true;
}
}
}

教授给出:

public class ListGeneral {

protected Node firstNode; // firstNode can be used by this
// class and any of its subclass.
private Node currentNode, previousNode; // These are usable only
// within this class.

public ListGeneral(){ // Constructor creates an
// empty list.
currentNode = null;
firstNode = null;
previousNode = null;
}

/*
* The method addAfterCurrent adds a new node with value x
* after the current node.
*/
public void addAfterCurrent(Object x){
if (firstNode == null){
firstNode = new Node(x, null);
currentNode = firstNode;
}
else{
Node newNode = new Node(x, currentNode.getNext());
currentNode.setNext(newNode);
previousNode = currentNode;
currentNode = newNode;
}
}

/*
* The method addBeforeCurrent adds a new node with value x
* before the current node.
*/
public void addBeforeCurrent(Object x){
if (firstNode == null){
firstNode = new Node(x, null);
currentNode = firstNode;
}
else {
Node newNode = new Node(x, currentNode);
if (previousNode != null) {
previousNode.setNext(newNode);
}
else{
firstNode = newNode;
}
currentNode = newNode;
}
}

/*
* removeCurrent() deletes the current node. This is defined
* only if the list is not empty.
*/
public void removeCurrent(){
Node temp;
if (listIsEmpty() || endOfList()) return;
temp = currentNode.getNext();
/*
* if previousNode is null, firstNode is currentNode.
*/

if (previousNode == null) {
firstNode = temp;
}
else {
previousNode.setNext(temp);
}
currentNode = currentNode.getNext();
}

/*
* listIsEmpty() is true if list is empty.
* current() returns the current node.
* restart() makes the the first node the current node.
*/


public boolean listIsEmpty(){
return firstNode == null;
}

public Object currentValue(){
return currentNode.getValue();
}

public void restart(){
currentNode = firstNode;
previousNode = null;
}

/* endOfList() is true if current is not pointing to
* any node.
*/

public boolean endOfList(){
return currentNode == null;
}

/* getNextNode makes the next node the current node.
* The method returns true if the operation was successful
* otherwise it returns false.
*/
public boolean getNextNode(){
if (currentNode == null) {
return false;
}
else {
previousNode = currentNode;
currentNode = currentNode.getNext();
return true;
}
}
/*
* method toString() returns the result of invoking toString()
* on all successive elements of the list.
*/

public String toString(){
String s = "";
for(restart(); !endOfList(); getNextNode()){
s += currentValue() + "\n";
}
return s;
}
}

以及给出的:

public class Node {
private Object value; // self-referential link.
private Node next;

public Node(Object value, Node nextNode) // The constructor inserts the
{ // arguments in the new object.
this.value = value;
this.next = nextNode;
}
public Object getValue(){
return value;
}

public Node getNext(){
return next;
}

public void setValue(Object value){
this.value = value;
}

public void setNext(Node next){
this.next = next;
}
}

最佳答案

问题是您在 SortedListofInt 类中设置 needToRestart = true 。因此,当您执行初始检索时,它会调用它两次,但设置 needToRestart =假。下次当您调用检索时,它仅打印一次。设置 needToRestart = false 最初对我有用并打印出正确的输出。

这对我有用

public class SortedListOfInt {

ListGeneral myList = new ListGeneral();

private boolean needToRestart = false;
private boolean restartFlag = false; //the only change

...

}

关于Java排序链表打印两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40622432/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com