所有考試都已經結束,是時候好好學習數據結構,前些日子學了數據結構的線性表和隊列就開始準備期末考,現在要把剩下的內容好好補上。一些相對簡單的內容就不在博客上記錄,把一些複雜的,自己有思考的內容記錄在博客上。
空雙向鏈表
帶頭結點的雙向鏈表
頭結點看作是兩個相同的節點,它的前驅節點是本身,後繼節點也是本身,這樣就實現了自循環。
插入
有了這樣的思想,那麼插入操作就很好理解了,我們在p處插入節點,p節點的前指針指向的節點的下一個就是s,s的前驅節點就是p的前驅節點,s的後繼節點就是p,此時p的前驅節點變爲了s,注意步驟的順序
// 插入數據
public void insert(Object element,int i) {
Node pNode = head.next; //讓pNode爲頭結點的下一個
int j=0;
while (j<i&&!pNode.equals(head)) {//尋找要插入的位置
pNode = pNode.next;
j++;
}
if (j!=i) {//j<i或者i<0
throw new IndexOutOfBoundsException("插入位置不合法");
}
Node sNode = new Node(element);
pNode.prior.next = sNode;
sNode.prior = pNode.prior;
sNode.next = pNode;
pNode.prior = sNode;
}
刪除
同插入類似的思想,刪除算法只需要改變刪除節點前驅節點和後繼節點的指針指向就好了
public void remove(int i){
Node pNode = head.next;
int j = 0;
while(j<i&&!pNode.equals(head)){
pNode = pNode.next;
j++;
}
if (j!=i) {
throw new IndexOutOfBoundsException("刪除的位置錯誤");
}
pNode.prior.next = pNode.next;
pNode.next.prior = pNode.prior;
}
完整代碼:
//帶頭結點的雙向鏈表
class Node {
Object data;
Node next;
Node prior;
public Node(){
}
public Node(Object data){
this.data = data;
}
}
public class DuLinkList {
// 頭結點
private Node head;
// 無參數構造函數,初始化頭結點
public DuLinkList() {
head = new Node();
head.prior = head;
head.next = head;
}
// 插入數據
public void insert(Object element,int i) {
Node pNode = head.next; //讓pNode爲頭結點的下一個
int j=0;
while (j<i&&!pNode.equals(head)) {//尋找要插入的位置
pNode = pNode.next;
j++;
}
if (j!=i) {//j<i或者i<0
throw new IndexOutOfBoundsException("插入位置不合法");
}
Node sNode = new Node(element);
pNode.prior.next = sNode;
sNode.prior = pNode.prior;
sNode.next = pNode;
pNode.prior = sNode;
}
public void remove(int i){
Node pNode = head.next;
int j = 0;
while(j<i&&!pNode.equals(head)){
pNode = pNode.next;
j++;
}
if (j!=i) {
throw new IndexOutOfBoundsException("刪除的位置錯誤");
}
pNode.prior.next = pNode.next;
pNode.next.prior = pNode.prior;
}
public void display(){
Node pNode = head.next;
while(!pNode.equals(head)){
System.out.print(pNode.data+" ");
pNode = pNode.next;
}
System.out.println();
}
public static void main(String[] args) {
DuLinkList linkList = new DuLinkList();
linkList.insert("AA", 0);
linkList.insert("BB", 1);
linkList.insert("CC", 2);
linkList.display();
linkList.remove(1);
linkList.display();
}
}