java數據結構之實現雙向鏈表的示例
/**
* 雙向鏈表的實現
* @author Skip
* @version 1.0
*/
public class DoubleNodeList<T> {
//節(jié)點類
private static class Node<T>{
Node<T> perv; //前節(jié)點
Node<T> next; //后節(jié)點
T data; //數據
public Node(T t){
this.data = t;
}
}
private Node<T> head; //頭節(jié)點
private Node<T> last; //尾節(jié)點
private Node<T> other; //備用節(jié)點存放臨時操作
private int length; //鏈表長度
/**
* 無參構造
*/
public DoubleNodeList(){
head = new Node<T>(null);
last = head;
length = 0;
}
/**
* 初始化時創(chuàng)建一個節(jié)點
* @param data 數據
*/
public DoubleNodeList(T data){
head = new Node<T>(data);
last = head;
length = 1;
}
/**
* 添加一個節(jié)點
* @param data 添加的數據
*/
public void add(T data){
if(isEmpty()){
head = new Node<T>(data);
last = head;
length++;
}else{
//尾插法
other = new Node<T>(data);
other.perv = last;
last.next = other;
last = other;
length++;
}
}
/**
* 在指定數據后插入一個節(jié)點
* @param data 指定的數據
* @param insertData 插入的數據
* @return 插入成功返回true,不成功返回false
*/
public boolean addAfert(T data , T insertData){
other = head;
while(other != null){
if(other.data.equals(data)){
Node<T> t = new Node<T>(insertData);
t.perv = other;
t.next = other.next;
other.next = t;
//判斷是否在最后一個節(jié)點后添加節(jié)點
if(t.next==null){
last = t;
}
length++;
return true;
}
other = other.next;
}
return false;
}
/**
* 在指定數據前插入一個節(jié)點
* @param data 指定的數據
* @param insertData 插入的數據
* @return 插入成功返回true,不成功返回false
*/
public boolean addBefore(T data, T insertData){
other = head;
while(other != null){
if(other.data.equals(data)){
Node<T> t = new Node<T>(insertData);
t.perv = other.perv;
t.next = other;
other.perv.next = t;
length++;
return true;
}
other = other.next;
}
return false;
}
/**
* 獲得索引處的數據
* @param index 索引
* @return 數據
*/
public T get(int index){
if(index>length || index<0){
throw new IndexOutOfBoundsException("索引越界:"+index);
}
other = head;
for(int i=0;i<index;i++){
other = other.next;
}
return other.data;
}
/**
* 新值替換舊值
* @return 成功為true,未找到為false
*/
public boolean set(T oldValue,T newValue){
other = head;
while(other!=null){
if(other.data.equals(oldValue)){
other.data = newValue;
return true;
}
other = other.next;
}
return false;
}
/**
* 移除指定的元素
* @param data 需要移除的元素
* @return 不存在為false,成功為true
*/
public boolean remove(T data){
other = head;
while(other != null){
if(other.data.equals(data)){
other.perv.next = other.next;
length--;
return true;
}
other = other.next;
}
return false;
}
/**
* 鏈表中是否包含此元素
* @return 包含為true,不包含為false
*/
public boolean contains(T data){
other = head;
while(other != null){
if(other.data.equals(data)){
return true;
}
other = other.next;
}
return false;
}
/**
* 獲得最后一個節(jié)點的數據
* @return 最后一個節(jié)點的數據
*/
public T getLast(){
return last.data;
}
/**
* 獲得第一個節(jié)點的數據
* @return 第一個節(jié)點的數據
*/
public T getFirst(){
return head.data;
}
/**
* 獲得鏈表的長度
* @return 長度
*/
public int getSize(){
return length;
}
/**
* 是否為空鏈表
* @return 空鏈表為true,非空鏈表為false
*/
public boolean isEmpty(){
return length==0;
}
/**
* 清空鏈表
*/
public void clear(){
head = null;
length = 0;
}
/**
* 輸出鏈表內所有節(jié)點
*/
public void printList(){
if(isEmpty()){
System.out.println("空鏈表");
}else{
other = head;
for(int i=0;i<length;i++){
System.out.print(other.data+" ");
other = other.next;
}
System.out.println();
}
}
}
相關文章
spring中WebClient如何設置連接超時時間以及讀取超時時間
這篇文章主要給大家介紹了關于spring中WebClient如何設置連接超時時間以及讀取超時時間的相關資料,WebClient是Spring框架5.0引入的基于響應式編程模型的HTTP客戶端,它提供一種簡便的方式來處理HTTP請求和響應,需要的朋友可以參考下2024-08-08
SpringBoot整合Sa-Token實現登錄認證的示例代碼
本文主要介紹了SpringBoot整合Sa-Token實現登錄認證的示例代碼,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-01-01
Struts1和struts2的區(qū)別_動力節(jié)點Java學院整理
這篇文章主要為大家詳細介紹了Struts1和struts2的區(qū)別,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-09-09
SpringBoot優(yōu)雅的進行全局異常處理的實現步驟
在軟件開發(fā)的世界里,異常處理是保證系統(tǒng)穩(wěn)定性和用戶體驗的關鍵因素之一,尤其是在構建基于微服務架構的應用時,SpringBoot提供了一套強大的工具來幫助開發(fā)者管理這些異常,所以本文給大家介紹了SpringBoot如何優(yōu)雅的進行全局異常處理,需要的朋友可以參考下2025-02-02

