[英]Java Double Linked List
好吧,我的教授(数据结构课程)对此进行了分配:您的任务是编写一个程序,该程序可以更新双向链接列表中的字符访问频率。 该程序应一次从一个包含许多字符的文本文件中读取一个字符。 为了简化起见,请勿计算空格。 每次访问字符时,在列表节点中将其访问频率增加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
对象来交换节点。 自己先尝试,然后用Google搜索。 这是每个程序员都必须知道的基本过程。
建议:
“我知道没有任何行从文件中获取信息。” 。 您最好现在就编写该代码,以便可以测试已经编写的代码。
另一个问题是,到目前为止,您编写的是一个通用链接列表,而忽略了要求如何使用列表的要求。 结果,您具有:
返回并查看需求,找出您实际需要的方法,然后实施它们。 (到目前为止,您所做的是“自下而上”的设计,而该设计基本上忽略了顶层的需求。使用“自上而下”的方法会更好。)
您需要解决的问题是整理字符,而不是创建“通用”链接列表数据结构。
我建议将程序分解为各个组成部分。 正如塞巴斯蒂安所说,您知道您需要保留和更新计数。 您还知道您需要能够将节点的数量与排名中其上方节点的数量进行比较。 您知道您需要能够交换两个节点。 您应该有针对这些事情的方法。 仔细考虑每种细分方法中需要发生的事情。
我总是建议针对这些问题的物理方法,以使他们有所体会:尝试使用一组便签纸或便签纸进行此操作。 在每个对象上,写一个对象名称和Node对象的字段。 用铅笔写字段值。 在一张纸上记下其他字段(例如对第一个元素的引用)。 然后逐步执行算法,查看每次更新需要更改的内容。 (注意:因为这是一个双向链接的列表,所以您的更改应该在混叠一堆纸牌后仍然有效。尝试一下,看看)
祝你好运!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.