您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“Java如何實(shí)現(xiàn)雙向鏈表”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
1.1 雙向鏈表的每個(gè)節(jié)點(diǎn)組成包含節(jié)點(diǎn)數(shù)據(jù),上一個(gè)節(jié)點(diǎn)(pre),下一個(gè)節(jié)點(diǎn)(next)
1.2 雙向鏈表節(jié)點(diǎn)結(jié)構(gòu)
class Node { //節(jié)點(diǎn)數(shù)據(jù)data int data; Node pre; Node next; public Node(int data) { this.data = data; } public Node() { super(); } }
2.1 雙向鏈表的增刪改查
public class DoubleLinkedList { private Node first; private Node current; private static class Node { int data; Node pre; Node next; public Node(int data) { super(); this.data = data; } public Node() { super(); } } public DoubleLinkedList() { super(); } /** * 雙向鏈表增加 */ public void add(int val) { // 如果是頭結(jié)點(diǎn) if (first == null) { Node node = new Node(val); first = node; first.pre = null; first.next = null; current = first; } else { Node node = new Node(val); current.next = node; node.pre = current; current = node; } } /** * 雙向鏈表的刪除 刪除所有值為val的元素 */ public void del(int val) { if (first == null) { System.out.println("雙向鏈表為空,無法進(jìn)行刪除操作!"); } else { Node node = first; while(true) { // 首節(jié)點(diǎn)的刪除可能 if (node.data == val) { //如果只有一個(gè)節(jié)點(diǎn) if(node.next==null) { node=null; first=null; System.out.println("刪除所有的"+val+"成功"); return; }else { node = node.next; node.pre.next=null; node.pre=null; first=node; //刪除后重新循環(huán)判斷首節(jié)點(diǎn)是否值相等 continue; } } else { while (node.next != null) { if (node.data == val) { node.pre.next = node.next; node.next.pre = node.pre; Node tempNode = node.pre; node.pre=null; node.next=null; node = tempNode; } node = node.next; } // 末節(jié)點(diǎn)刪除可能 if (node.data == val) { node.pre.next=null; node.pre=null; } System.out.println("刪除所有的"+val+"成功"); //末節(jié)點(diǎn)判斷完成后,結(jié)束循環(huán) return; } } } } /** * 遍歷雙向鏈表操作 */ public void traverse() { if(first==null) { System.out.println("雙向鏈表為空"); }else { Node node = first; //循環(huán)遍歷到倒數(shù)第二個(gè)節(jié)點(diǎn)截止 while(node.next!=null) { System.out.print(node.data+" "); node=node.next; } //遍歷最后一個(gè)節(jié)點(diǎn) System.out.print(node.data); } } /** * 雙向鏈表插入操作,在所有值為value的后面插入一個(gè)數(shù)insert */ public void insert(int value,int insert) { if(first==null) { System.out.println("雙向鏈表為空,無法插入"); }else { Node node = first; //循環(huán)遍歷到倒數(shù)第二個(gè)節(jié)點(diǎn)截止 while(node.next!=null) { if(node.data==value) { Node insertNode = new Node(insert); node.next.pre = insertNode; insertNode.next = node.next; node.next = insertNode; insertNode.pre = node; } node=node.next; } //最后一個(gè)節(jié)點(diǎn)后插入 if(node.data == value) { Node insertNode = new Node(insert); node.next = insertNode; insertNode.pre = node; } System.out.println(); System.out.println("插入操作完成"); } } /** * 雙向鏈表修改數(shù)據(jù),將所有值為val的修改為revised */ public void revise(int val,int revised) { if(first==null) { System.out.println("雙向鏈表為空,無法修改"); }else { Node node = first; while (node.next!=null) { if(node.data == val) { node.data = revised; } node=node.next; } if(node.data == val) {} node.data = revised; } System.out.println("修改操作完成"); } /** * 查找雙向鏈表中是否包含val值 * @param val */ public void contain(int val) { if(first==null) { System.out.println("鏈表為空,無法查找"); }else { Node node = first; while(node!=null) { if(node.data==val) { System.out.println("該鏈表中包含"+val+"的值"); return; }else { node=node.next; } } System.out.println("該鏈表不包含"+val); } } }
2.2 測試類(main入口函數(shù))
public class Main { public static void main(String[] args) { DoubleLinkedList list = new DoubleLinkedList(); list.add(1); list.add(1); list.add(2); list.insert(1, 3); list.add(2); list.add(3); list.traverse(); System.out.println(); list.del(1); list.traverse(); list.add(4); System.out.println(); list.traverse(); System.out.println(); list.contain(4); list.contain(3); list.contain(0); } }
1)、循環(huán)結(jié)束是到倒數(shù)第二個(gè)節(jié)點(diǎn)截止的,要考慮多種不同的情況,頭節(jié)點(diǎn)刪除,尾結(jié)點(diǎn)刪除等,導(dǎo)致刪除函數(shù)復(fù)雜了很多
2)、在contain函數(shù)中有修改到循環(huán)到最后一個(gè)節(jié)點(diǎn)
3)、后續(xù)對刪除函數(shù)修改有空再操作(待完成)
“Java如何實(shí)現(xiàn)雙向鏈表”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。