gpt4 book ai didi

Java 双链表

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

好吧,我的教授(数据结构课)布置了这个:你的任务是编写一个程序来更新双向链表中的字符访问频率。该程序应一次从包含许多字符的文本文件中读取一个字符。为了方便起见,不要计算空格。每次访问一个字符时,将其访问频率在列表的节点中递增 1。如果当前节点的频率高于其前一个节点的频率,则需要在列表中交换这两个节点。对所有先前的节点继续这样做,直到没有更多的先前节点具有较低的访问频率。最终,出现频率最高的字符会出现在列表的开头,次高的会出现在下一个节点,等等。你的程序还需要按照列表的顺序打印出列表中的字符。

这是我到目前为止制作的程序。到目前为止,它只是一个双向链表。我的主要问题是我应该如何处理“每次访问一个字符时,在列表的节点中将其访问频率增加一个。如果当前节点的频率高于其前一个节点的频率,则两个节点需要在列表中交换。”?

我知道没有任何行从文件中获取信息。我稍后再补充。感谢您的帮助!

public class DoublyLinkedList {
private class Node {
String value;
Node next,prev;

public Node(String val, Node n, Node p) {
value = val;
next = n;
prev=p;
}

Node(String val) {
this(val, null, null);
}
}
private Node first;
private Node last;

public DoublyLinkedList() {
first = null;
last = null;
}
public boolean isEmpty(){
return first==null;
}
public int size(){
int count=0;
Node p=first;
while(p!=null){
count++;
p=p.next;
}
return count;
}
public void add(String e) {

if(isEmpty()){
last=new Node(e);
first=last;
}
else{
last.next=new Node(e, null, last);
last=last.next;
}
}
public void add(int index, String e){
if(index<0||index>size()){
String message=String.valueOf(index);
throw new IndexOutOfBoundsException(message);
}
if(index==0){
Node p=first;
first=new Node(e,p,null);
if(p!=null)
p.prev=first;
if(last==null)
last=first;
return;
}
Node pred=first;
for(int k=1; k<=index-1;k++){
pred=pred.next;
}
Node succ=pred.next;
Node middle=new Node(e,succ,pred);
pred.next=middle;
if(succ==null)
last=middle;
else
succ.prev=middle;
}
public String toString(){
StringBuilder strBuilder=new StringBuilder();
Node p=first;
while(p!=null){
strBuilder.append(p.value+"\n");
p=p.next;
}
return strBuilder.toString();
}
public String remove(int index){
if(index<0||index>=size()){
String message=String.valueOf(index);
throw new IndexOutOfBoundsException(message);
}
Node target=first;
for(int k=1; k<=index;k++){
target=target.next;
}
String element=target.value;
Node pred=target.prev;
Node succ=target.next;
if(pred==null)
first=succ;
else
pred.next=succ;
if(succ==null)
last=pred;
else
succ.prev=pred;
return element;
}
public boolean remove(String element){
if(isEmpty())
return false;
Node target=first;
while(target!=null&&!element.equals(target.value))
target=target.next;
if(target==null)
return false;
Node pred=target.prev;
Node succ=target.next;
if(pred==null)
first=succ;
else
pred.next=succ;
if(succ==null)
last=pred;
else
succ.prev=pred;
return true;
}
public static void main(String[] args){
DoublyLinkedList list1=new DoublyLinkedList();
String[] array={"a","c","e","f"};
for(int i=0; i<array.length; i++){
list1.add(array[i]);
}
list1.add(1,"b");
list1.add(3,"d");
System.out.println(list1);

}


}

最佳答案

由于这是家庭作业,我只会给出提示:

  • 您的 Node 类需要一个额外的计数器字段。

  • 您需要遍历列表以找到访问的字符并增加其计数器值。

  • 您需要一个临时的 Node 对象来交换节点。先自己试一下,再谷歌一下。这是每个程序员都必须知道的基本过程。

关于Java 双链表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15593478/

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