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-01Spring事務(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-04SpringBoot+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-04Mybatis的mapper標(biāo)簽 namespace屬性用法說明
這篇文章主要介紹了Mybatis的mapper標(biāo)簽 namespace屬性用法說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09