本篇內容介紹了“Java如何實現雙向鏈表”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
1.1 雙向鏈表的每個節點組成包含節點數據,上一個節點(pre),下一個節點(next)
1.2 雙向鏈表節點結構
class Node {
//節點數據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) {
// 如果是頭結點
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("雙向鏈表為空,無法進行刪除操作!");
} else {
Node node = first;
while(true) {
// 首節點的刪除可能
if (node.data == val) {
//如果只有一個節點
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;
//刪除后重新循環判斷首節點是否值相等
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;
}
// 末節點刪除可能
if (node.data == val) {
node.pre.next=null;
node.pre=null;
}
System.out.println("刪除所有的"+val+"成功");
//末節點判斷完成后,結束循環
return;
}
}
}
}
/**
* 遍歷雙向鏈表操作
*/
public void traverse() {
if(first==null) {
System.out.println("雙向鏈表為空");
}else {
Node node = first;
//循環遍歷到倒數第二個節點截止
while(node.next!=null) {
System.out.print(node.data+" ");
node=node.next;
}
//遍歷最后一個節點
System.out.print(node.data);
}
}
/**
* 雙向鏈表插入操作,在所有值為value的后面插入一個數insert
*/
public void insert(int value,int insert) {
if(first==null) {
System.out.println("雙向鏈表為空,無法插入");
}else {
Node node = first;
//循環遍歷到倒數第二個節點截止
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;
}
//最后一個節點后插入
if(node.data == value) {
Node insertNode = new Node(insert);
node.next = insertNode;
insertNode.pre = node;
}
System.out.println();
System.out.println("插入操作完成");
}
}
/**
* 雙向鏈表修改數據,將所有值為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入口函數)
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)、循環結束是到倒數第二個節點截止的,要考慮多種不同的情況,頭節點刪除,尾結點刪除等,導致刪除函數復雜了很多
2)、在contain函數中有修改到循環到最后一個節點
3)、后續對刪除函數修改有空再操作(待完成)
“Java如何實現雙向鏈表”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。