java實(shí)現(xiàn)雙向鏈表的增刪改
雙向鏈表:java實(shí)現(xiàn)雙向鏈表的增刪改,供大家參考,具體內(nèi)容如下
單向鏈表,查找的方向只能是一個(gè)方向,而雙向鏈表可以向前或者向后查找
單向鏈表不能自我刪除,需要靠輔助節(jié)點(diǎn),而雙向鏈表,則可以自我刪除
1、遍歷方和單鏈表一樣,只是可以向前,也可以向后查找
2、 添加(默認(rèn)添加到雙向鏈表的最后)
(1) 先找到雙向鏈表的最后這個(gè)節(jié)點(diǎn)
(2) temp.next = newHeroNode
(3) newHeroNode.pre = temp
3、修改思路和原來(lái)的單向鏈表一樣
4、刪除
(1) 因?yàn)槭请p向鏈表,因此,我們可以實(shí)現(xiàn)自我刪除某個(gè)節(jié)點(diǎn)
(2) 直接找到要?jiǎng)h除的這個(gè)節(jié)點(diǎn),比如temp
(3) temp.pre.next = temp.next
(4) temp.next.pre = temp.pre
代碼實(shí)現(xiàn)
package com.hsy.linkedlist;
public class DoubleLinkedListDemo {
? ? public static void main(String[] args) {
? ? ? ? System.out.println("雙向鏈表測(cè)試:");
? ? ? ? //先創(chuàng)建節(jié)點(diǎn)
? ? ? ? HeroNode2 hero1 = new HeroNode2(1, "劉備", "仁義");
? ? ? ? HeroNode2 hero2 = new HeroNode2(2, "關(guān)羽", "武圣");
? ? ? ? HeroNode2 hero3 = new HeroNode2(3, "張飛", "暴躁");
? ? ? ? HeroNode2 hero4 = new HeroNode2(4, "趙云", "單騎救主");
? ? ? ? //創(chuàng)建一個(gè)雙向鏈表
? ? ? ? DoubleLinkedList doubleLinkedList = new DoubleLinkedList();
? ? ? ? doubleLinkedList.add(hero1);
? ? ? ? doubleLinkedList.add(hero2);
? ? ? ? doubleLinkedList.add(hero3);
? ? ? ? doubleLinkedList.add(hero4);
? ? ? ? //顯示鏈表
? ? ? ? doubleLinkedList.showList();
? ? ? ? //修改
? ? ? ? HeroNode2 newHeroNode = new HeroNode2(4, "好湯圓", "hsy");
? ? ? ? doubleLinkedList.update(newHeroNode);
? ? ? ? System.out.println("修改后:");
? ? ? ? doubleLinkedList.showList();
? ? ? ? //刪除
? ? ? ? doubleLinkedList.delete(3);
? ? ? ? System.out.println("刪除后:");
? ? ? ? doubleLinkedList.showList();
? ? }
}
//創(chuàng)建一個(gè)雙向鏈表
class DoubleLinkedList {
? ? //初始化一個(gè)頭節(jié)點(diǎn),不存放數(shù)據(jù)
? ? private final HeroNode2 head = new HeroNode2(0, "", "");
? ? //返回頭節(jié)點(diǎn)
? ? public HeroNode2 getHead() {
? ? ? ? return head;
? ? }
? ? //遍歷
? ? public void showList() {
? ? ? ? //判斷鏈表是否為空
? ? ? ? if (head.next == null) {
? ? ? ? ? ? System.out.println("鏈表為空!");
? ? ? ? }
? ? ? ? //由于頭節(jié)點(diǎn)不能動(dòng),因此我們需要一個(gè)輔助變量來(lái)遍歷
? ? ? ? HeroNode2 temp = head.next;
? ? ? ? while (true) {
? ? ? ? ? ? //判斷鏈表是否到最后
? ? ? ? ? ? if (temp == null) {
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? }
? ? ? ? ? ? System.out.println(temp);
? ? ? ? ? ? //這時(shí)需要將temp后移,否則會(huì)陷入死循環(huán)
? ? ? ? ? ? temp = temp.next;
? ? ? ? }
? ? }
? ? //添加一個(gè)新的節(jié)點(diǎn)在雙向鏈表中
? ? public void add(HeroNode2 heroNode2) {
? ? ? ? //思路:(不考慮編號(hào)順序)
? ? ? ? //1.找到當(dāng)前鏈表的最后節(jié)點(diǎn)
? ? ? ? //2.將最后這個(gè)節(jié)點(diǎn)的next域指向新的節(jié)點(diǎn)
? ? ? ? HeroNode2 temp = head;
? ? ? ? //遍歷鏈表,找到最后的節(jié)點(diǎn)
? ? ? ? while (true) {
? ? ? ? ? ? if (temp.next == null) {
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? }
? ? ? ? ? ? //如果沒(méi)有找到最后,將temp后移
? ? ? ? ? ? temp = temp.next;
? ? ? ? }
? ? ? ? //必須保證退出while循環(huán)時(shí),temp指向鏈表的最后,并將最后這個(gè)節(jié)點(diǎn)的next域指向新的節(jié)點(diǎn)
? ? ? ? //形成一個(gè)雙向鏈表
? ? ? ? temp.next = heroNode2;
? ? ? ? heroNode2.pre = temp;
? ? }
? ? //修改節(jié)點(diǎn)
? ? public void update(HeroNode2 newHeroNode2) {
? ? ? ? //判斷鏈表是否為空
? ? ? ? if (head.next == null) {
? ? ? ? ? ? System.out.println("鏈表為空!");
? ? ? ? }
? ? ? ? HeroNode2 temp = head.next;
? ? ? ? boolean flag = false;
? ? ? ? while (true) {
? ? ? ? ? ? if (temp == null) {
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? }
? ? ? ? ? ? if (temp.no == newHeroNode2.no) {
? ? ? ? ? ? ? ? //找到
? ? ? ? ? ? ? ? flag = true;
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? }
? ? ? ? ? ? temp = temp.next;
? ? ? ? }
? ? ? ? //根據(jù)flag判斷是否找到需要修改的值
? ? ? ? if (flag) {//編號(hào)已經(jīng)存在
? ? ? ? ? ? temp.name = newHeroNode2.name;
? ? ? ? ? ? temp.nickname = newHeroNode2.nickname;
? ? ? ? } else {//沒(méi)有找到
? ? ? ? ? ? System.out.println("沒(méi)有找到編號(hào)為:" + newHeroNode2.no + "的節(jié)點(diǎn),不能修改");
? ? ? ? }
? ? }
? ? //刪除節(jié)點(diǎn)
? ? public void delete(int no) {
? ? ? ? //判斷當(dāng)前鏈表是否為空
? ? ? ? if (head.next==null){
? ? ? ? ? ? System.out.println("鏈表為空,無(wú)法刪除");
? ? ? ? }
? ? ? ? HeroNode2 temp = head.next;
? ? ? ? boolean flag = false;
? ? ? ? while (true) {
? ? ? ? ? ? if (temp == null) {
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? }
? ? ? ? ? ? if (temp.no == no) {
? ? ? ? ? ? ? ? //找到了待刪除節(jié)點(diǎn)的前一個(gè)結(jié)點(diǎn)temp
? ? ? ? ? ? ? ? flag = true;
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? }
? ? ? ? ? ? temp = temp.next;
? ? ? ? }
? ? ? ? if (flag) {
? ? ? ? ? ? temp.pre.next = temp.next;
? ? ? ? ? ? //如果要?jiǎng)h除的是最后一個(gè)節(jié)點(diǎn),就不能執(zhí)行下面這句話(huà),否則會(huì)出現(xiàn)空指針異常
? ? ? ? ? ? if (temp.next!=null){
? ? ? ? ? ? ? ? temp.next.pre=temp.pre;
? ? ? ? ? ? }
? ? ? ? } else {
? ? ? ? ? ? System.out.println("要?jiǎng)h除的" + no + "節(jié)點(diǎn)不存在");
? ? ? ? }
? ? }
}
class HeroNode2 {
? ? public int no;
? ? public String name;
? ? public String nickname;
? ? public HeroNode2 next;//指向下一個(gè)節(jié)點(diǎn)
? ? public HeroNode2 pre;//指向上一個(gè)節(jié)點(diǎn)
? ? //創(chuàng)建構(gòu)造器
? ? public HeroNode2(int no, String name, String nickname) {
? ? ? ? this.no = no;
? ? ? ? this.name = name;
? ? ? ? this.nickname = nickname;
? ? }
? ? @Override
? ? public String toString() {
? ? ? ? return "HeroNode{" +
? ? ? ? ? ? ? ? "no=" + no +
? ? ? ? ? ? ? ? ", name='" + name + '\'' +
? ? ? ? ? ? ? ? ", nickname='" + nickname + '\'' +
? ? ? ? ? ? ? ? '}';
? ? }
}以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java 利用DeferredResult實(shí)現(xiàn)http輪詢(xún)實(shí)時(shí)返回?cái)?shù)據(jù)接口
這篇文章主要介紹了Java 利用 DeferredResult 實(shí)現(xiàn) http 輪詢(xún)實(shí)時(shí)返回?cái)?shù)據(jù)接口,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下2021-03-03
IDEA一鍵部署SpringBoot項(xiàng)目到服務(wù)器的教程圖解
本文通過(guò)圖文并茂的形式給大家介紹IDEA一鍵部署SpringBoot項(xiàng)目到服務(wù)器的教程,非常不錯(cuò),給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2022-02-02
logback輸出日志屏蔽quartz的debug等級(jí)日志方式
這篇文章主要介紹了logback輸出日志屏蔽quartz的debug等級(jí)日志方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
Java JVM運(yùn)行時(shí)數(shù)據(jù)區(qū)(Run-Time Data Areas)
運(yùn)行時(shí)數(shù)據(jù)區(qū),是java虛擬機(jī)定義的在程序執(zhí)行期間使用的各種運(yùn)行時(shí)的數(shù)據(jù)區(qū),通過(guò)JVM運(yùn)行時(shí)數(shù)據(jù)區(qū)圖例給大家展示的很詳細(xì),對(duì)JVM 運(yùn)行時(shí)數(shù)據(jù)區(qū)相關(guān)知識(shí)感興趣的朋友跟隨小編一起看看吧2021-06-06
Java類(lèi)的繼承實(shí)例詳解(動(dòng)力節(jié)點(diǎn)Java學(xué)院整理)
在Java開(kāi)發(fā)中,我們常常用到繼承這一概念,可以說(shuō)繼承是Java這類(lèi)面向?qū)ο缶幊陶Z(yǔ)言的基石,今天小編一起和大家一起學(xué)習(xí)java類(lèi)的繼承2017-04-04
java生成jar包并且單進(jìn)程運(yùn)行的實(shí)例
下面小編就為大家分享一篇java生成jar包并且單進(jìn)程運(yùn)行的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-12-12
springboot中的springSession的存儲(chǔ)和獲取實(shí)現(xiàn)
這篇文章主要介紹了springboot中的springSession的存儲(chǔ)和獲取實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
java根據(jù)擴(kuò)展名獲取系統(tǒng)圖標(biāo)和文件圖標(biāo)示例
這篇文章主要介紹了java根據(jù)擴(kuò)展名獲取系統(tǒng)圖標(biāo)和文件圖標(biāo)示例,需要的朋友可以參考下2014-03-03

