完整代码示例-Java实现双链表的插入,删除,查找,修改和遍历

代码示例:

package DataStrcture.ArrayDemo.doublelinkedlistdemo;

public class DoubleLinkedListFinalDemo {
    ///结点类
    static class Node {
        //指针域和数据域
        Node next;
        Node pre;
        int num;

        ///构造器和toString()
        public Node(int num) {
            this.num = num;
        }

        public String toString() {
            return "num= " + num;
        }
    }

    // 头结点, 标识链表的开头
    Node head = new Node(0);

    ///1. 普通添加节点
    public void add(Node node) {
        ///临时结点
        Node temp = head;

        while (true) {
            if (temp.next == null)
                break;
            temp = temp.next;
        }
        temp.next = node;
        node.pre = temp;
    }
    ///2. 添加结点到指定位置
    /手动设置index从1开始
    public void addByIndex(Node node, int index){
        //临时结点
        Node temp = head;
        //查找这个位置并插入这个结点
        int count=0;
        while(true){
            if(temp.next == null)
                break;
            temp = temp.next;
            count++;
            if(index == count){
                //插入结点到当前temp后
                node.next = temp.next;
                node.pre = temp;
                temp.next = node;
                依然是跟删除一样的问题
                //如果插入到最后一个结点的后面,那么 node.next必然会导致空指针异常
                while(node.next != null){
                    node.next.pre = node;
                    break;
                }
                  break;
            }
        }

    }
    ///3. 删除结点
    /* 特点: temp指示的结点正是要删除的结点
    双链表的删除:
        temp.pre.next = temp.next;
        temp.next.pre = temp.pre;
     */
    public void del(int num){
        ///临时结点
        Node temp = head;

        while(true){
            if(temp.next == null){
                System.out.println("链表为空或者是没找到这个结点");
                break;
            }
            temp = temp.next;
            if(temp.num == num){
                temp.pre.next = temp.next;
                ///如果要删除的结点正好是最后一个结点,
                 这句话中temp.next必然导致空指针异常
                //所以我们需要加上这个判断,如果删除最后一个节点则不执行下面这一语句的操作
                while(temp.next != null)
                    temp.next.pre = temp.pre;

                break;
            }
        }
    }

    ///4.查找并修改结点
    ///alter(要修改的结点值, 需要修改为的值)
    public void alter(int target, int val){
        //临时结点
        Node temp = head;

        while(true){
            if(temp.next == null){
                System.out.println("链表为空或者是没找到这个结点");
                break;
            }
                

            temp = temp.next;
            if(temp.num == target){
                temp.num = val;
                break;
            }
        }
    }
    
    //5. 遍历链表
    public void list(){
        //临时变量
        Node temp = head;
        
        while(true){
            if(temp.next == null)
                break;
            temp = temp.next;
            System.out.println(temp);
        }
    }
    
    测试类
    public static void main(String[] args) {
        DoubleLinkedListFinalDemo dl = new DoubleLinkedListFinalDemo();

       Node node_1 = new Node(6);
       Node node_2 = new Node(1);
       Node node_3 = new Node(7);
       Node node_4 = new Node(2);
       Node node_5 = new Node(9);
       Node node_6 = new Node(5);
       Node node_7 = new Node(12);
       Node node_9 = new Node(79);
       Node node_10 = new Node(80);

        Node node_8 = new Node(55);///待添加的新节点
        dl.add(node_1);
        dl.add(node_2);
        dl.add(node_3);
        dl.add(node_4);
        dl.add(node_5);
        dl.add(node_6);
        dl.add(node_7);
        dl.add(node_9);
        dl.add(node_10);

        System.out.println("1.普通添加后的双链表为: ");
        dl.list();
        System.out.println("===============================");

        System.out.println("2. 添加值为55的新节点到第六个结点之后: ");
        dl.addByIndex(node_8, 6);
        dl.list();
        System.out.println("===============================");
        System.out.println("3.删除值为80的那个结点: ");
        dl.del(80);
        dl.list();
        System.out.println("===============================");
        System.out.println("4.查找值为7的结点并把它改为100");
        dl.alter(7,100);
        dl.list();
        System.out.println("===============================");
    }
}

运行结果:

在这里插入图片描述
在这里插入图片描述

posted @ 2022-05-26 20:31  青松城  阅读(54)  评论(0编辑  收藏  举报