第三篇技術部落格 相當的不好意思 還是沒培養成寫部落格的習慣 看了看上一篇的時間3月13 很多感觸 晚點另寫一篇總結吧……
這個總結有點相當的過時了 上周就做好了但是一直沒細想 現在由于學校課程正在用C實作中 思想相通 姑且把java版本的總結如下
用連結清單實作隊列,首先思考的就是隊列的常見功能:插入,添加,删除,索引查找,周遊列印,長度統計,修改.
然後就是思考如何用連結清單表示,連結清單的結構特點便是前後相連,與數組這些順序結構相比,連結清單特點便是所存取的部分在記憶體中不連續,前一個元素對象指向下一個,這種指向關系,在C中是指針,在Java中便是引用傳遞,我覺得差別C與java的也就在這裡。(C學的很爛,指針始終沒弄明白,也沒回頭看,不過學JAVA時定義結點類時看到在一個結點類中定義下一個結點為屬性,忽然一下就有種懂了的感覺,呵呵),是以對隊列的操作便是對這些結點的各種操作,改變結點的屬性。
具體實作代碼如下;
首先是必須要定義好結點類滴:
public class LinkNode {
private Object obj;
private LinkNode next;
public LinkNode(Object obj){//重載構造器,傳入資料
this.obj=obj;
}
public Object getObj() {
return obj;
}
public void setObj(Object obj) {
this.obj = obj;
}
public LinkNode getNext() {
return next;
}
public void setNext(LinkNode next) {
this.next = next;
}
}
四個方法,兩個屬性。
然後就可以寫隊列類的方法了:
首先定義兩個結點:
private LinkNode root=null;
private LinkNode rear=root;
root是根節點,rear是目前結點
隊列相應的操作方法就如下了:
//添加元素的方法
public void add(Object obj){//添加元素
LinkNode node=new LinkNode(obj);
if(root==null){
root=node;
rear=root;
}else{
rear.setNext(node);
rear=node;
}
}
//删除指定元素
public void remove(int index){
int count=0;
rear=root;
if(index==0){
root=root.getNext();
}
while(rear!=null&&rear.getNext()!=null){
if(count==index-1){
rear.setNext(rear.getNext().getNext());
}
count++;
rear=rear.getNext();
}
}
//傳回隊列長度
public int size(){
int count=0;
if(root==null){
return 0;
}else{
count++;
rear=root.getNext();
while(rear!=null){
count++;
rear=rear.getNext();
}
}
return count;
}
//傳回指定元素
public Object get(int index){
int count=0;
if(index<0||index>=size()){
throw new RuntimeException();
}
else{
rear=root;
while(rear!=null){
if(count==index){
return rear.getObj();
}
else{
count++;
rear=rear.getNext();
}
}
}
return null;
}
//指定位置插入元素
//此處是用後插法
public void insert(int index,Object obj){
int count=0;
rear=root;
LinkNode node=new LinkNode(obj);
while(rear!=null&&rear.getNext()!=null){
if(count==index){
node.setNext(rear.getNext());
rear.setNext(node);
}
count++;
rear=rear.getNext();
}
if(rear!=null&&rear.getNext()==null){
if(count==index){
rear.setNext(node);
}
}
}
//修改指定元素
public void modify(int index,Object obj){
int count=0;
if(index<0||index>=size()){
throw new RuntimeException();
}
else{
rear=root;
while(rear!=null){
if(count==index){
rear.setObj(obj);
// break;
}
count++;
rear=rear.getNext();
}
}
}
//列印整個隊列
public void printLinkList(){
rear=root;
while(rear!=null){
Object obj=rear.getObj();
System.out.println(obj);
rear=rear.getNext();
}
}
總體感覺,寫的這些方法都很類似。都是要沿頭結點向後查找,如果索引值與計數的count相等,則執行相應删除,修改或添加操作,重要的便是如何調用結點類的四個方法,尤其是後兩個setNext()和getNext(),使連結清單始終保持連接配接而不中斷……
思路是第一位的,明确要實作的功能,再按難易和必要性分塊,一步步實作,具體到代碼就是分塊的執行循環,指派等基本操作,判斷條件的標明,整體子產品的調用,呵呵 這是最近寫代碼的感受 。
還是要交流才能進步的快,寫出來,感覺挺舒服,錯誤歡迎指正,感激不盡………嘿嘿 加油