Java 數(shù)據(jù)結(jié)構(gòu)與算法系列精講之環(huán)形鏈表
概述
從今天開始, 小白我將帶大家開啟 Java 數(shù)據(jù)結(jié)構(gòu) & 算法的新篇章.

鏈表
鏈表 (Linked List) 是一種遞歸的動(dòng)態(tài)數(shù)據(jù)結(jié)構(gòu). 鏈表以線性表的形式, 在每一個(gè)節(jié)點(diǎn)存放下一個(gè)節(jié)點(diǎn)的指針. 鏈表解決了數(shù)組需要先知道數(shù)據(jù)大小的缺點(diǎn), 增加了節(jié)點(diǎn)的指針域, 空間開銷較大.

鏈表包括三類:
- 單向鏈表
- 雙向鏈表
- 循環(huán)鏈表
環(huán)形鏈表
環(huán)形鏈表 (Circular Linked List) 將單鏈表最后一個(gè)節(jié)點(diǎn)指向頭節(jié)點(diǎn), 即為環(huán)形鏈表. 如圖:

環(huán)形鏈表實(shí)現(xiàn)
Node 類
// Node類
private class Node<E> {
public E e; // 元素
private Node next; // 下一個(gè)節(jié)點(diǎn)
// 構(gòu)造
public Node(E e) {
this.e = e;
this.next = null;
}
@Override
public String toString() {
return e.toString();
}
}
insert 方法
// 插入數(shù)據(jù)
public void insert(E e) {
// 創(chuàng)建節(jié)點(diǎn)
Node node = new Node(e);
if (size == 0) {
head = node;
head.next = head;
tail = head;
} else {
tail.next = node;
node.next = tail;
tail = node;
}
size ++;
}
remove 方法
// 刪除元素
public void remove(int index) {
// 檢查索引是否越界
if (index < 0 || index > size) {
throw new RuntimeException("Invalid Index");
}
// 獲取index前一個(gè)節(jié)點(diǎn)
Node prev = head;
for (int i = 0; i < index - 1; i++) {
prev = prev.next;
}
// 刪除數(shù)據(jù)
Node retNode = prev.next;
prev.next = retNode.next;
size --;
}
main
// main
public static void main(String[] args) {
// 創(chuàng)建循環(huán)鏈表
CircularLinkedList<Integer> circularLinkedList = new CircularLinkedList<>();
// 插入
for (int i = 0; i < 5; i++) {
circularLinkedList.insert(i);
System.out.println(circularLinkedList);
}
// 刪除
for (int i = 0; i < 2; i++) {
circularLinkedList.remove(0);
System.out.println(circularLinkedList);
}
}
輸出結(jié)果:
0
0->1
0->1->2
0->1->2->3
0->1->2->3->4
0->2->3->4
0->3->4
完整代碼
public class CircularLinkedList<E> {
// Node類
private class Node<E> {
public E e; // 元素
private Node next; // 下一個(gè)節(jié)點(diǎn)
// 構(gòu)造
public Node(E e) {
this.e = e;
this.next = null;
}
@Override
public String toString() {
return e.toString();
}
}
// 頭節(jié)點(diǎn)和尾節(jié)點(diǎn)
private Node head = null;
private Node tail = null;
private int size; // 鏈表大小
// 構(gòu)造函數(shù)
public CircularLinkedList() {
head = new Node(null);
size = 0;
}
// 插入數(shù)據(jù)
public void insert(E e) {
// 創(chuàng)建節(jié)點(diǎn)
Node node = new Node(e);
if (size == 0) {
head = node;
head.next = head;
tail = head;
} else {
tail.next = node;
node.next = tail;
tail = node;
}
size ++;
}
// 刪除元素
public void remove(int index) {
// 檢查索引是否越界
if (index < 0 || index > size) {
throw new RuntimeException("Invalid Index");
}
// 獲取index前一個(gè)節(jié)點(diǎn)
Node prev = head;
for (int i = 0; i < index - 1; i++) {
prev = prev.next;
}
// 刪除數(shù)據(jù)
Node retNode = prev.next;
prev.next = retNode.next;
size --;
}
// 鏈表是否為空
public boolean isEmpty() {
return size == 0;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
Node cur = head;
while (cur != tail) {
builder.append(cur + "->");
cur = cur.next;
}
builder.append(cur);
return builder.toString();
}
// main
public static void main(String[] args) {
// 創(chuàng)建循環(huán)鏈表
CircularLinkedList<Integer> circularLinkedList = new CircularLinkedList<>();
// 插入
for (int i = 0; i < 5; i++) {
circularLinkedList.insert(i);
System.out.println(circularLinkedList);
}
// 刪除
for (int i = 0; i < 2; i++) {
circularLinkedList.remove(0);
System.out.println(circularLinkedList);
}
}
}
到此這篇關(guān)于Java 數(shù)據(jù)結(jié)構(gòu)與算法系列精講之環(huán)形鏈表的文章就介紹到這了,更多相關(guān)Java 環(huán)形鏈表內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java網(wǎng)絡(luò)通信中ServerSocket的設(shè)計(jì)優(yōu)化方案
今天小編就為大家分享一篇關(guān)于Java網(wǎng)絡(luò)通信中ServerSocket的設(shè)計(jì)優(yōu)化方案,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-04-04
各種格式的編碼解碼工具類分享(hex解碼 base64編碼)
這篇文章主要介紹了各種格式的編碼解碼工具類,集成Commons-Codec、Commons-Lang及JDK提供的編解碼方法2014-01-01
Spring事務(wù)失效的一種原因關(guān)于this調(diào)用的問題
這篇文章主要介紹了Spring事務(wù)失效的一種原因關(guān)于this調(diào)用的問題,本文給大家分享問題原因及解決辦法,通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-10-10
全面解析Spring Security 內(nèi)置 Filter
這篇文章主要介紹了Spring Security 內(nèi)置 Filter的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07
詳解備忘錄模式及其在Java設(shè)計(jì)模式編程中的實(shí)現(xiàn)
這篇文章主要介紹了詳解備忘錄模式及其在Java設(shè)計(jì)模式編程中的實(shí)現(xiàn),備忘錄模式數(shù)據(jù)的存儲(chǔ)過程中應(yīng)當(dāng)注意淺拷貝和深拷貝的問題,需要的朋友可以參考下2016-04-04
SpringBoot+SpringCache實(shí)現(xiàn)兩級(jí)緩存(Redis+Caffeine)
這篇文章主要介紹了SpringBoot+SpringCache實(shí)現(xiàn)兩級(jí)緩存(Redis+Caffeine),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
Mybatis的mapper標(biāo)簽 namespace屬性用法說明
這篇文章主要介紹了Mybatis的mapper標(biāo)簽 namespace屬性用法說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09

