java數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)雙向鏈表功能
雙向鏈表實(shí)現(xiàn)
雙向鏈表也叫雙鏈表,是鏈表的一種,它的每個(gè)數(shù)據(jù)結(jié)點(diǎn)中都有兩個(gè)指針,分別指向直接后繼和直接前驅(qū)。所以,從雙向鏈表中的任意一個(gè)結(jié)點(diǎn)開(kāi)始,都可以很方便地訪問(wèn)它的前驅(qū)結(jié)點(diǎn)和后繼結(jié)點(diǎn)。
注意:在操作雙向鏈表時(shí),不要去移動(dòng)指向前驅(qū)節(jié)點(diǎn)和后繼節(jié)點(diǎn)的指針,而是重新定義指向頭尾的指針進(jìn)行移動(dòng)。*
環(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;
}
/**
* 獲取鏈表長(zhǎng)度
*
* @return
*/
@Override
public int size() {
return this.size;
}
}
測(cè)試方法
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));
}
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(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)文章
SpringBoot3.3中實(shí)現(xiàn)多端口監(jiān)聽(tīng)的示例代碼
在SpringBoot應(yīng)用中實(shí)現(xiàn)多端口監(jiān)聽(tīng),可以讓一個(gè)應(yīng)用處理不同類型的HTTP請(qǐng)求或暴露多個(gè)服務(wù)接口,本文詳細(xì)講解了通過(guò)配置application.yml文件和編寫自定義配置類的方法,實(shí)現(xiàn)了對(duì)多個(gè)端口的監(jiān)聽(tīng),感興趣的可以了解一下2024-11-11
hibernate 中 fetch=FetchType.LAZY 懶加載失敗處理方法
這篇文章主要介紹了hibernate 中 fetch=FetchType.LAZY 懶加載失敗處理方法,需要的朋友可以參考下2017-09-09
JAVA使用動(dòng)態(tài)代理對(duì)象進(jìn)行敏感字過(guò)濾代碼實(shí)例
這篇文章主要介紹了JAVA使用動(dòng)態(tài)代理對(duì)象進(jìn)行敏感字過(guò)濾代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09
使用JPA中@Query 注解實(shí)現(xiàn)update 操作方法(必看)
下面小編就為大家?guī)?lái)一篇使用JPA中@Query 注解實(shí)現(xiàn)update 操作方法(必看)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-06-06
Spring boot實(shí)現(xiàn)熱部署的兩種方式詳解
這篇文章主要介紹了Spring boot實(shí)現(xiàn)熱部署的兩種方式,這兩種方法分別是使用 Spring Loaded和使用spring-boot-devtools進(jìn)行熱部署,文中給出了詳細(xì)示例代碼和介紹,需要的朋友可以參考學(xué)習(xí),下面來(lái)一起看看吧。2017-04-04
Java并發(fā)編程示例(二):獲取和設(shè)置線程信息
這篇文章主要介紹了Java并發(fā)編程示例(二):獲取和設(shè)置線程信息,本文是系列文章的第二篇,本文著重講解Thread類的幾個(gè)重要屬性,需要的朋友可以參考下2014-12-12

