Java双向链表按照顺序添加节点的方法实例

时间:2022-09-26 08:59:53

分析过程:

首先需要比较待添加的节点编号与已有的节点编号的大小,若待添加的节点编号已经存在,则不能加入。为防止出现空指针的情况,需要对节点的位置进行判断。

示例代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
package linkedlist;
 
public class DoubleLinkedListDemo {
 
    public static void main(String[] args) {
        // 测试
        System.out.println("双向链表的测试");
        // 创建节点
        Node node1 = new Node(1, "道明寺");
        Node node2 = new Node(2, "花泽类");
        Node node3 = new Node(3, "西门总二郎");
        Node node4 = new Node(4, "美作玲");
        // 创建一个双向链表
        DoubleLinkedList doubleLinkedList = new DoubleLinkedList();
        // 添加节点
        doubleLinkedList.addByOrder(node1);
        doubleLinkedList.addByOrder(node4);
        doubleLinkedList.addByOrder(node3);
        doubleLinkedList.addByOrder(node2);
        // 显示排序后的双向链表
        doubleLinkedList.list();
    }
}
 
// 创建一个双向链表的类
class DoubleLinkedList {
    // 先初始化头节点,头节点不动
    private Node head = new Node(0, "");
    
    // 返回头节点
    public Node getHead() {
        return head;
    }
    
    // 添加节点时,根据编号将节点插入到指定位置
    // 如果有这个编号,则添加失败,并给出提示
    public void addByOrder(Node node) {
        // 头节点不能动,通过一个辅助指针(变量)帮助找到需要添加的位置
        Node temp = head;
        boolean flag = false;   // flag标志添加的编号是否存在,默认为false
        while(true) {
            if(temp.next == null) {
                break;
            }
            if(temp.next.no > node.no) {
                break;
            }
            if(temp.next.no == node.no) {
                flag = true;
                break;
            }
            temp = temp.next;   // 遍历链表
        }
        if(flag) {
            System.out.printf("输入的编号%d已经存在,不能加入\n", node.no);
        }
        else {
            // 为防止出现空指针的情况,需要对temp节点位置进行判断
            // 若双向链表尚未到达尾端,则需要将node节点与其相邻的后面的节点进行连接
            if(temp.next != null) {
                node.next = temp.next;
                temp.next.pre = node;
            }
            // 无论双向链表是否到达尾端,都需要将node节点与其相邻的前面的节点进行连接
            temp.next = node;
            node.pre = temp;
        }
    }
    
    // 遍历双向链表的方法
    // 显示链表【遍历】
    public void list() {
        // 判断链表是否为空
        if(head.next == null) {
            System.out.println("链表为空");
            return;
        }
        // 因为头节点不能动,需要一个辅助变量来遍历
        Node temp = head.next;
        while (true) {
            // 判断是否到链表最后
            if(temp == null)
                break;
            // 输出节点的信息
            System.out.println(temp);
            // 将temp后移
            temp = temp.next;
        }
    }
}
 
// 创建一个双向链表的类
// 定义Node,每个Node对象就是一个节点
class Node {
    public int no;
    public String name;
    public Node next;   // 指向下一个节点,默认为null
    public Node pre;    // 指向前一个节点,默认为null
    // 构造器
    public Node(int no, String name) {
        this.no = no;
        this.name = name;
    }
    // 为了显示方便,重新toString
    @Override
    public String toString() {
        return "Node [no=" + no + ", name=" + name +"]";
    }
}

运行结果运行结果

Java双向链表按照顺序添加节点的方法实例

总结

到此这篇关于Java双向链表按照顺序添加节点的文章就介绍到这了,更多相关Java双向链表按照顺序添加节点内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/Peppaaa/article/details/113546576