栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

双向链表按编号顺序添加

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

双向链表按编号顺序添加

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

代码实现:

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

测试结果:

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/678008.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号