双向链表按编号顺序添加

         实现双向链表按照编号的顺序进行添加,不允许添加编号已经存在的节点。

代码实现:

    //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;
	}
}

测试结果:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

半岛铁子_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值