Java實現(xiàn)雙向鏈表
本文實例為大家分享了Java實現(xiàn)雙向鏈表的具體代碼,供大家參考,具體內容如下
1、雙向鏈表
1.1 雙向鏈表的每個節(jié)點組成包含節(jié)點數(shù)據(jù),上一個節(jié)點(pre),下一個節(jié)點(next)
1.2 雙向鏈表節(jié)點結構
class Node {
//節(jié)點數(shù)據(jù)data
?? ??? ?int data;
?? ??? ?Node pre;
?? ??? ?Node next;
?? ??? ?public Node(int data) {
?? ??? ??? ?this.data = data;
?? ??? ?}
?? ??? ?public Node() {
?? ??? ??? ?super();
?? ??? ?}
?? ??? ?
?? ?}2、雙向鏈表的增刪改查(crud)
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) {
?? ??? ??? ??? ?// 首節(jié)點的刪除可能
?? ??? ??? ??? ?if (node.data == val) {
?? ??? ??? ??? ??? ?//如果只有一個節(jié)點
?? ??? ??? ??? ??? ?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é)點是否值相等
?? ??? ??? ??? ??? ??? ?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é)點刪除可能
?? ??? ??? ??? ??? ?if (node.data == val) {
?? ??? ??? ??? ??? ??? ?node.pre.next=null;
?? ??? ??? ??? ??? ??? ?node.pre=null;
?? ??? ??? ??? ??? ?}
?? ??? ??? ??? ??? ?System.out.println("刪除所有的"+val+"成功");
?? ??? ??? ??? ??? ?//末節(jié)點判斷完成后,結束循環(huán)
?? ??? ??? ??? ??? ?return;
?? ??? ??? ??? ?}
?? ??? ??? ?}
?? ??? ?}
?? ?}
?? ?/**
?? ? * 遍歷雙向鏈表操作
?? ? */
?? ?public void traverse() {
?? ??? ?if(first==null) {
?? ??? ??? ?System.out.println("雙向鏈表為空");
?? ??? ?}else {
?? ??? ??? ?Node node = first;
?? ??? ??? ?//循環(huán)遍歷到倒數(shù)第二個節(jié)點截止
?? ??? ??? ?while(node.next!=null) {
?? ??? ??? ??? ?System.out.print(node.data+" ");
?? ??? ??? ??? ?node=node.next;
?? ??? ??? ?}
?? ??? ??? ?//遍歷最后一個節(jié)點
?? ??? ??? ?System.out.print(node.data);
?? ??? ?}
?? ?}
?? ?/**
?? ? * 雙向鏈表插入操作,在所有值為value的后面插入一個數(shù)insert
?? ? */
?? ?public void insert(int value,int insert) {
?? ??? ?
?? ??? ?if(first==null) {
?? ??? ??? ?System.out.println("雙向鏈表為空,無法插入");
?? ??? ?}else {
?? ??? ??? ?Node node = first;
?? ??? ??? ?//循環(huán)遍歷到倒數(shù)第二個節(jié)點截止
?? ??? ??? ?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;
?? ??? ??? ?}
?? ??? ??? ?//最后一個節(jié)點后插入
?? ??? ??? ?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);
?? ?}
}3、一些缺點待修改
1)、循環(huán)結束是到倒數(shù)第二個節(jié)點截止的,要考慮多種不同的情況,頭節(jié)點刪除,尾結點刪除等,導致刪除函數(shù)復雜了很多
2)、在contain函數(shù)中有修改到循環(huán)到最后一個節(jié)點
3)、后續(xù)對刪除函數(shù)修改有空再操作(待完成)
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
SpringBoot實現(xiàn)網(wǎng)頁消息推送的5種方法小結
項目開發(fā)中,實時消息推送已成為提升用戶體驗的關鍵技術,本文將詳細介紹SpringBoot中實現(xiàn)網(wǎng)頁消息推送的幾種主流方案,希望對大家有所幫助2025-03-03
SpringBoot里使用Servlet進行請求的實現(xiàn)示例
這篇文章主要介紹了SpringBoot里使用Servlet進行請求的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-01-01

