gpt4 book ai didi

java - LinkedList打印和删除问题

转载 作者:太空宇宙 更新时间:2023-11-04 07:40:25 26 4
gpt4 key购买 nike

好吧,我一直在争论是否要问并保留这个问题,看看是否能得到一些答案。我已经修复了大部分错误,但我对这个 LinkedList 有一个很大的问题。现在,它不断删除第一个节点后面的所有节点,并显示除最后一个节点之外的所有节点。我似乎无法弄清楚我的问题出在哪里。我一直在使用 jgrasp 中的调试来提供帮助,但它并没有太大帮助

我已经为那些想要运行它并看看会发生什么的人提供了我正在处理的两个文件

文件输入是一个文本文件,其内容类似于:

 1,10
5,16
2,7
4,12
3,19
6,25
9,13
7,21
8,4

它也需要一个代表时间的整数。我已经 使用5

这是我的主文件:

import java.util.*;
import java.io.*;

public class Test_RoundRobin{

public static void main(String args[]) throws IOException {
LinkedList list=new LinkedList();
String file=args[0];
int cpuTime=Integer.parseInt(args[1]);

Scanner fin=new Scanner(new FileReader(file));
String pattern=",";
fin.useDelimiter(pattern);
while(fin.hasNext()){
String s=fin.nextLine();
String[] array=s.split(pattern);
int pid=Integer.parseInt(array[0]);
int time=Integer.parseInt(array[1]);
list.add(pid, time);
}
fin.close();
System.out.println(list);
list.sortList();
System.out.println(list);
int count=1;
while(list.size!=0){
list.timeSlice(cpuTime);
System.out.println("Run " + count + ": " + list);
count++;
}
System.out.println(list);
}
}

这是我拥有的 LinkedList 文件:我正在使用虚拟头节点,它是一个循环单链表。

public class LinkedList{
private class Node{
private int pid;
private int time;
private Node next;

public Node(int pid, int time){
this.pid=pid;
this.time=time;
}
}//end Node

int size;
Node head;

public void add(int pid, int time) {
Node curr=head;
Node newNode=new Node(pid, time);
//empty list
if(head==null){
head=newNode;
newNode.next=head;
}//end if
else{
while(curr.next!=head){
curr=curr.next;
}//end while
curr.next=newNode;
newNode.next=head;
}//end else
size++;
}//end add

public void delete(Node curr){
if(size==0){
return;
}
else if(head==curr){
head=curr.next;
}
else{
Node prev=find(curr);
prev.next=curr.next;
}
size--;
}

public Node find(Node curr){
for(Node prev=head; prev.next!=curr; prev=prev.next){
return prev;
}
return curr;
}

public void sortList(){
Node position; // Position to fill...
Node start; // Where to start looking for the smallest...

if(size>=0){
for(position=head; position.next!=head; position=position.next){
Node smallest=position;

for(start=position.next; start!=head; start=start.next){
if (start.pid<smallest.pid){
smallest = start;
}//end if
}//end for
int tempPID=position.pid;
int tempTime=position.time;
position.pid=smallest.pid;
position.time=smallest.time;
smallest.pid=tempPID;
smallest.time=tempTime;
}//end for
}//end if
}//end sortList

public void timeSlice(int cpuTime){
for(Node curr=head; curr.next!=head; curr=curr.next){
curr.time=curr.time-cpuTime;
System.out.print("<" + curr.pid + ", " + curr.time +">" + " ");
//if the time remaining <= 0 then remove the node
if(curr.time<=0){
System.out.println("Process " + curr.pid + " has finished, and is now being terminated");
delete(curr);
}
}
}

public String toString(){
String s="";
for(Node curr=head; curr.next!=head; curr=curr.next)
s=s+"<"+curr.pid+", "+curr.time+"> ";

return s;
}
}

提前致谢,非常感谢。

最佳答案

首先,您没有像您所说的那样使用虚拟节点。如果列表仅包含单个节点,则它实际上永远不会被删除,因为 head.next 又只是 head 。这也会使列表处于不一致的状态,其中 size 为 0,但它仍然有一个节点。

如果您要查找不在列表中的节点,

find 将给出不正确的结果。您可能应该检测到这一点并抛出异常。

关于java - LinkedList打印和删除问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16137015/

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