实现双向链表按照编号的顺序进行添加,不允许添加编号已经存在的节点。
代码实现:
//Node类
class Node{
public int no; //节点的顺序
public Node next; // 指向下一个节点
public Node pre; // 指向前一个节点
//构造方法
public Node(int no) {
this.no = no;
}
}
//双向链表按照编号顺序添加
public void addByOrder(Node node) {
// 先初始化一个头节点, 不存放具体的数据
private Node head = new Node(0); 0为节点的编号
Node temp = head;
boolean flag = false; //编号是否存在的标志
while(true) {
if(temp.next == null) { //temp已经在链表的最后
break;
}
if(temp.next.no > node.no) { //位置已找到
break;
} else if (temp.next.no == node.no) {//编号已存在,no为Node类中的属性,代表编号
flag = true;
break;
}
temp = temp.next;
}
if(flag) { //编号已存在,不能添加
System.out.printf("编号%d已经存在,不能添加\n", node.no);
} else {
//进行插入
//要考虑是否是最后一个元素,如果是,则不执行下面代码,
//否则temp.next已经为空,是没有指向的,会出现空指针的情况
if(temp.next != null) {
node.next = temp.next; //待添加元素next指向temp的下一个节点
temp.next.pre = node; //temp的下一个节点的pre指向待插入节点
}
temp.next = node; //temp的next节点指向node节点
node.pre = temp; //node的pre指向temp节点
}
}
下面给出整个的测试代码,按照任意顺序进行添加,输出的还是有顺序的。
public class Demo {
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);
// 创建一个双向链表
LinkedList linkedList = new LinkedList();
//按照任意顺序添加
linkedList.addByOrder(node2);
linkedList.addByOrder(node4);
linkedList.addByOrder(node3);
linkedList.addByOrder(node1);
//遍历显示
linkedList.list();
}
}
//创建一个双向链表的类
class LinkedList {
// 先初始化一个头节点, 不存放具体的数据
private Node head = new Node(0); //0为节点的编号
//双向链表按照编号顺序添加
public void addByOrder(Node node) {
Node temp = head;
boolean flag = false; //编号是否存在的标志
while(true) {
if(temp.next == null) { //temp已经在链表的最后
break;
}
if(temp.next.no > node.no) { //位置已找到
break;
} else if (temp.next.no == node.no) {//编号已存在,no为Node类中的属性,代表编号
flag = true;
break;
}
temp = temp.next;
}
if(flag) { //编号已存在,不能添加
System.out.printf("编号%d已经存在,不能添加\n", node.no);
} else {
//进行插入
//要考虑是否是最后一个元素,如果是,则不执行下面代码,
//否则temp.next已经为空,是没有指向的,会出现空指针的情况
if(temp.next != null) {
node.next = temp.next; //待添加元素next指向temp的下一个节点
temp.next.pre = node; //temp的下一个节点的pre指向待插入节点
}
temp.next = node; //temp的next节点指向node节点
node.pre = temp; //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.no);
// 将temp后移
temp = temp.next;
}
}
}
// Node类
class Node {
public int no; // 节点的顺序
public Node next; // 指向下一个节点
public Node pre; // 指向前一个节点
// 构造方法
public Node(int no) {
this.no = no;
}
}
测试结果: