[英]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.