天天看點

Java單連結清單(個人總結)

第三篇技術部落格 相當的不好意思 還是沒培養成寫部落格的習慣 看了看上一篇的時間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(),使連結清單始終保持連接配接而不中斷……

思路是第一位的,明确要實作的功能,再按難易和必要性分塊,一步步實作,具體到代碼就是分塊的執行循環,指派等基本操作,判斷條件的標明,整體子產品的調用,呵呵 這是最近寫代碼的感受 。

還是要交流才能進步的快,寫出來,感覺挺舒服,錯誤歡迎指正,感激不盡………嘿嘿 加油