java數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)雙向鏈表功能
雙向鏈表實(shí)現(xiàn)
雙向鏈表也叫雙鏈表,是鏈表的一種,它的每個(gè)數(shù)據(jù)結(jié)點(diǎn)中都有兩個(gè)指針,分別指向直接后繼和直接前驅(qū)。所以,從雙向鏈表中的任意一個(gè)結(jié)點(diǎn)開始,都可以很方便地訪問它的前驅(qū)結(jié)點(diǎn)和后繼結(jié)點(diǎn)。
注意:在操作雙向鏈表時(shí),不要去移動指向前驅(qū)節(jié)點(diǎn)和后繼節(jié)點(diǎn)的指針,而是重新定義指向頭尾的指針進(jìn)行移動。*
環(huán)境
IDEA
自定義操作接口
雙向鏈表。
public interface MyList<E> { void add(E node); E get(int index); E remove(int index); int size(); }
實(shí)現(xiàn)類
public class MyDoublyLinkList<E> implements MyList<E> { /** * 定義雙向鏈表節(jié)點(diǎn) */ class Node<E> { Node<E> prev; E item; Node<E> next; public Node(Node<E> prev, E item, Node<E> next) { this.prev = prev; this.item = item; this.next = next; } } private Node<E> head; private Node<E> tail; private int size; /** * 將節(jié)點(diǎn)添加到尾部 * * @param item * @return */ @Override public void add(E item) { this.linkLast(item); } /** * 添加一個(gè)元素到尾部 * * @param e */ private void linkLast(E e) { //獲取tail Node<E> node = this.tail; //創(chuàng)建一個(gè)node Node<E> newNode = new Node<>(node, e, null); this.tail = newNode; if (node == null) this.head = newNode; else node.next = newNode; size++; } /** * 獲取指定位置元素 * @param index * @return */ @Override public E get(int index) { //校驗(yàn)index是否合法 checkIndex(index); //獲取index元素 return getNode(index).item; } /** * 校驗(yàn)index合法性 * * @param index */ private void checkIndex(int index) { if (!(index >= 0 && index < this.size)) throw new IndexOutOfBoundsException(String.format("index out of bounds,index:%s,size:%s", index, this.size)); } /** * 獲取node * * @param index * @return */ private Node<E> getNode(int index) { if (index > (size >> 1)) { Node<E> node = this.tail; //從tail向前遍歷 for (int i = size - 1; i > index; i--) { node = node.prev; } return node; } else { //從head向后遍歷 Node<E> node = this.head; for (int i = 0; i < index; i++) { node = node.next; } return node; } } /** * 刪除指定位置元素 * * @param index * @return */ @Override public E remove(int index) { //判斷index合法性 this.checkIndex(index); Node<E> node = getNode(index); E e = node.item; //判斷是否為頭節(jié)點(diǎn) if (node.prev == null) { this.head = node.next; } else { node.prev.next = node.next; node.prev = null; } //判斷是否為尾節(jié)點(diǎn) if (node.next == null) { this.tail = node.next; } else { node.next.prev = node.prev; node.next = null; } node.item = null; size--; return e; } /** * 獲取鏈表長度 * * @return */ @Override public int size() { return this.size; } }
測試方法
public static void main(String[] args) { MyList<String> stringMyList = new MyDoublyLinkList<>(); System.out.println(stringMyList.size()); stringMyList.add("a"); stringMyList.add("b"); stringMyList.add("c"); stringMyList.add("d"); System.out.println(stringMyList.size()); String re = stringMyList.remove(1); System.out.println(re); for (int i = 0; i < stringMyList.size(); i++) { System.out.println(stringMyList.get(i)); } }
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Java?數(shù)據(jù)結(jié)構(gòu)與算法系列精講之單向鏈表
- Java 數(shù)據(jù)結(jié)構(gòu)與算法系列精講之環(huán)形鏈表
- 帶你了解Java數(shù)據(jù)結(jié)構(gòu)和算法之鏈表
- Java實(shí)現(xiàn)鏈表數(shù)據(jù)結(jié)構(gòu)的方法
- Java數(shù)據(jù)結(jié)構(gòu)與算法學(xué)習(xí)之雙向鏈表
- Java數(shù)據(jù)結(jié)構(gòu)與算法學(xué)習(xí)之循環(huán)鏈表
- Java 數(shù)據(jù)結(jié)構(gòu)之刪除鏈表中重復(fù)的結(jié)點(diǎn)
- Java數(shù)據(jù)結(jié)構(gòu)之順序表和鏈表精解
- Java?精煉解讀數(shù)據(jù)結(jié)構(gòu)的鏈表的概念與實(shí)現(xiàn)
相關(guān)文章
IntelliJ IDEA使用maven實(shí)現(xiàn)tomcat的熱部署
這篇文章主要介紹了IntelliJ IDEA使用maven實(shí)現(xiàn)tomcat的熱部署,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-07-07MyBatis開啟二級緩存實(shí)現(xiàn)過程解析
這篇文章主要介紹了MyBatis開啟二級緩存實(shí)現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07springmvc學(xué)習(xí)筆記-返回json的日期格式問題的解決方法
本篇文章主要介紹了springmvc學(xué)習(xí)筆記-返回json的日期格式問題的解決方法,解決了日期格式的輸出,有興趣的可以了解一下。2017-01-01SpringBoot下Mybatis的緩存的實(shí)現(xiàn)步驟
這篇文章主要介紹了SpringBoot下Mybatis的緩存的實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04java實(shí)現(xiàn)簡單的客戶信息管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡單的客戶信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06