鍊錶的結構決定了再煉表頭進行新增/刪除操作時時間複雜度僅為o(1),但是對鍊錶尾部進行操作的時間複雜度為o(n),而佇列是一種先進先出的資料結構,既要對隊首進行操作,也要對隊尾進行操作,所以必須對鍊錶進行一點修改,才能實現時間複雜度為o(1)的佇列.
修改的方式就是新增乙個尾指標,指向鍊錶的最後乙個節點,這個操作只是針對實現佇列時的優化,使得在鍊錶尾部新增元素的時間複雜度從o(n)將為o(1),也就是不需要從頭到尾遍歷,但是在鍊錶尾部刪除元素的時間複雜度依然是o(n),因為刪除時沒有辦法獲取被刪除節點的前乙個結點(因為沒有使用雙向鍊錶).
在鍊錶中使用尾節點要注意鍊錶為空的時候,head和tail都指向null,當鍊表中只有乙個元素的時候,head和tail指向同乙個節點.
實現時依然是先建立乙個queue介面類,用於定義佇列的一些必要操作,然後建立乙個linkedlistqueue類,實現queue介面就可以了.
具體**如下:
queue介面類:
public inte***ce queue
linkedlistqueue實現類:
/**
* 使用帶有尾指標的鍊錶實現佇列
* @author chenzhuji
* * @param */
public class linkedlistqueueimplements queue
public node()
public node(e e)
@override
public string tostring() }
private node head; //頭指標
private node tail; //尾指標
private int size; //節點個數
public linkedlistqueue()
/*** 獲取佇列中元素個數
*/@override
public int getsize()
/*** 判斷佇列是否為空
*/@override
public boolean isempty()
/*** 入隊操作
*/@override
public void enqueue(e e) else
} /**
* 出隊操作
*/@override
public e dequeue()
node ret = head;
head = head.next;
ret.next = null;
if(head == null)
size --;
return ret.e;
} /**
* 獲取隊頭元素
*/@override
public e getfront()
return head.e; }
@override
public string tostring()
return sb.tostring(); }
public static void main(string args)
llq.dequeue();
system.out.println(llq); }
}
佇列(二) 佇列的鍊錶實現方式
1.佇列的單向鍊錶的實現方法 return只可以返回乙個值,單向迴圈鍊錶來實現佇列的時候可以只保留乙個指標,因為保留rear指標能夠很方便的表示出front指標,所以保留rear指標。另外由於鍊錶的第乙個結點處理比較特殊,所以在初始化的時候需要單獨處理。鍊錶實現的佇列思想也是第乙個單元作為頭結點,不...
佇列(二) 佇列的鍊錶實現方式
1.佇列的單向鍊錶的實現方法 return僅僅能夠返回乙個值,單向迴圈鍊錶來實現佇列的時候能夠僅僅保留乙個指標,由於保留rear指標能夠非常方便的表示出front指標,所以保留rear指標。另外因為鍊錶的第乙個結點處理比較特殊,所以在初始化的時候須要單獨處理。鍊錶實現的佇列思想也是第乙個單元作為頭結...
佇列(二)佇列的鍊錶儲存
include define false 0 define ok 1 定義佇列每個節點的結構 typedef struct node node,qnode 相當於typedef struct node qnode 定義整個佇列結構 typedef struct squeue squeue 建立乙個空...