不帶頭結點的雙向迴圈鍊錶

2021-09-23 08:04:42 字數 2336 閱讀 9339

基本概念

迴圈鍊錶:將單鏈表中最後乙個結點的next指向頭結點或者空指標,就使得整個單鏈表形成乙個環,這種頭尾相接的單鏈表稱為單迴圈鍊錶,簡稱迴圈鍊錶。

雙向鍊錶:是在單鏈表的每個結點中,再設定乙個指向其前驅結點的指標域prior,在雙向鍊錶的結點中有兩個指標域,乙個next指向直接後繼,乙個prior指向直接前驅。

雙向迴圈鍊錶:將二者結合起來,結點有兩個指標域,且最後乙個結點的next指向頭結點。頭結點的上乙個結點指向最後乙個結點。

雙向迴圈鍊錶遍歷時的判斷結束的條件是當前結點的下乙個結點是否是頭結點,如果是表示當前結點是最後乙個結點。

如果鍊錶中只有乙個結點,它的直接前驅和直接後繼就是它自己。

插入時實現的原理:

將新結點的上乙個結點指最後乙個結點,即head的上乙個結點

將新結點的下乙個結點指向head結點

將最後乙個結點的下乙個結點指向新結點

將head的上乙個結點指向新結點

注意,如果是頭插法,每次四步完成之後 要將頭指標指向新結點

刪除時的原理:將temp.next賦值給temp.prior.next

將temp.prior賦值給temp.next.prior

實現**

結點**

public class node>

public node

(t value)

}

雙向迴圈鍊錶**

public class doublecircularlinkedlist

>

private boolean isempty()

//插入,不帶頭結點的雙向迴圈列表頭插法和尾插法的位置是一樣的

// 區別是頭插法每次插入完成後需要將頭指標指向剛插入的結點

public void

addhead

(t value)

else

} public void

add(t value)

public void

addlast

(t value)

else

n.prior = head.prior;

//n的值賦值給head;

n.next = head;

//n的下乙個結點是頭指標的下乙個結點

head.prior.next = n;

head.prior = n;

//將n賦值給head下乙個結點的前驅}}

//刪除值為value的所有結點

public void

remove

(t value)

temp = temp.next;

}while

(temp.next != head)

temp = temp.next;}if

(temp.value.

equals

(value))}

//修改第i個結點的value值

public t set

(int i,t value)

t data =

(t)temp.value;

temp.value = value;

return data;

}//查詢該value是第一次出現是第幾個結點

public int

search

(t value)

temp = temp.next;

num++;}

if(temp.value.

equals

(value)

)else

}//列印

public void

show()

system.out.

println

(temp.value);}

}

測試**

public class test 

}

不帶頭結點的單迴圈鍊錶

建立標頭檔案nlist.h pragma once 不帶頭節點的鍊錶,主要應用在迴圈鍊錶中,其缺點,操作複雜 會出現二級指標 優點 靈活 頭指標指向哪個節點哪個節點就是第乙個節點 不帶頭節點的單鏈迴圈鍊錶,尾節點的next指向第乙個節點 typedef struct nnode nnode,pnli...

實現帶頭結點的雙向迴圈鍊錶

dlist.h 帶頭節點的雙向迴圈鍊錶 為什麼要帶頭 原因是因為如果不帶頭的話,那麼頭插或者頭刪會比較麻煩 而且不帶頭的話需要傳遞二級指標,帶頭的話,只需要傳遞一級指標 為什麼給成雙向的?有乙個理由是可以逆向列印鍊錶 也就是對有些操作會簡單一些 pragma once 保證標頭檔案不會被重複包含 i...

鍊錶 帶頭結點的雙向迴圈鍊錶

還需改進 creat node這個函式應有返回型別,來判斷新建結點是否成功,不然主函式中不管成不成功都會訪問該節點成員。改了這個函式,在主函式中create node後要判斷是否成功,不成功就提示並退出函式,退出前別忘了還要釋放鍊錶!同時create link這個函式中也要判斷head是否申請成功,...