天天看点

自定义双向链表遍历、新增、修改和删除

代码如下:

package com.example.demo.test02;

import lombok.Data;

public class Test02 {
    public static void main(String[] args) {
        LinkedNode node1 = new LinkedNode(1, "位置1");
        LinkedNode node2 = new LinkedNode(2, "位置2");
        LinkedNode node3 = new LinkedNode(3, "位置3");
        LinkedNode node4 = new LinkedNode(4, "位置4");
        DoubleLinked doubleLinked =new DoubleLinked();
        System.out.println("修改前的链表");
        doubleLinked.add01(node1);
        doubleLinked.add01(node3);
        doubleLinked.add01(node2);
        doubleLinked.add01(node4);
        doubleLinked.showAll();
        LinkedNode node5 = new LinkedNode(1, "位置5");
        doubleLinked.update(node5);
        System.out.println("修改后的链表");
        doubleLinked.showAll();
        doubleLinked.delete(1);
        System.out.println("删除后的链表");
        doubleLinked.showAll();
    }
}

/**
 * 定义一个单链表
 */
class DoubleLinked {
    /**
     * 初始化LinkedNode
     */
    private LinkedNode head = new LinkedNode(0, "头节点");

    /**
     * 遍历所有的节点
     */
    public void showAll() {
        if (head.next == null) {
            System.out.println("链表为空");
            return;
        }
        LinkedNode temp = head.next;
        while (true) {
            if (temp == null) {
                return;
            }
            System.out.println(temp.address);
            temp = temp.next;
        }
    }

    /**
     * 第一种添加方法:只能根据添加的数据顺序进行排序
     * 添加节点
     */
    public void add01(LinkedNode linkedNode) {
        LinkedNode temp = head;
        while (true) {
            if (temp.next == null) {
                break;
            }
            temp = temp.next;
        }
        temp.next = linkedNode;
        linkedNode.pre = temp;
    }

    /**
     * 修改节点
     */
    public void update(LinkedNode newNode) {
        if (head.next == null) {
            System.out.println("链表为空");
            return;
        }
        LinkedNode temp = head.next;
        boolean flag = true;
        while (true) {
            if (temp == null) {
                break;
            }
            if (temp.no == newNode.no) {
                temp.setAddress(newNode.getAddress());
                return;
            }
            temp = temp.next;

        }
        if (false) {
            System.out.println("链表中没有该数据");
        }
    }

    /**
     * 删除节点
     */
    public void delete(int n) {
        if (head.next == null) {
            System.out.println("链表为空");
            return;
        }
        LinkedNode temp = head.next;
        boolean flag = false;
        while (true) {
            if (temp.no == n) {
                flag = true;
                break;
            }
            if (temp == null) {
                break;
            }
            temp = temp.next;
        }
        if (flag) {
            System.out.println("删除节点成功");
            if (temp.next == null) {
                temp.pre.next = null;
                return;
            } else {
                temp.pre.next = temp.next;
                temp.next.pre = temp.pre;
            }
        }
        System.out.println("没有该节点");
    }
}

@Data
class LinkedNode {
    /**
     * 位置
     */
    public int no;
    /**
     * 名称
     */
    public String address;
    /**
     * 指向下一个节点
     */
    public LinkedNode next;
    /**
     * 指向上一个节点
     */
    public LinkedNode pre;


    public LinkedNode(int no, String address) {
        this.no = no;
        this.address = address;
    }

    @Override
    public String toString() {
        return "LinkedNode{" +
                "no=" + no +
                ", address='" + address + '\'' +
                '}';
    }
}
           

继续阅读