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

分析过程:

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

示例代码:

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双向链表按照顺序添加节点内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java 实现链表结点插入

    PS:链表是一种数据结构,而数据结构就是一种存放数据的方式. 为什么需要链表? 我们知道,数组也可以存储数据,那么为什么还需要链表呢?接下来,我们来看看数组 和链表的区别: 1.数组就像身上编了号站成一排的人,要找第10个人很容易,根据人身上的编号很快就能找到.但插入.删除慢,要往某个位置插入或删除一个人时,后面的人身上的编号都要变.当然,加入或删除的人始终末尾的也快. 2.链表就像手牵着手站成一圈的人,要找第10个人不容易,必须从第一个人一个个数过去.但插入.删除快.插入时只要解开两个人的手,

  • Java单链表的简单操作实现教程

    前言 用Java实现单链表的简单操作,阅读本文和上一篇文章体会Java中类与C++中结构体指针的区别 提示:以下是本篇文章正文内容,下面案例可供参考 一.基本实现思路 构造结点类 构造链表类 具体测试实现 二.代码实现 1.定义结点类 package list.test01; /* *定义结点类 */ public class Node { private int data; public Node next; public Node(int data) { this.data = data;

  • 用JAVA实现单链表,检测字符串是否是回文串

    一.需求 使用JAVA实现单链表,使用单链表检测字符串是否是回文串 二.需求分析 回文串最重要的就是对称,那么最重要的问题就是找到那个中心,用快指针每步走两格,当他到达链表末端的时候,慢指针刚好到达中心,慢指针在遍历过程中(快指针到达末端时)把走过的节点进行反向操作,此时从中位点分为前后两部分,此时前半部分的指针开始往回指(取next的时候,取的是前一个节点),而慢指针继续向前,跟前半部分的数据依次进行比对,当慢指针扫完整个链表,就可以判断这是回文串,否则就提前退出,同时在前半部分往回遍历的过程

  • Java 8实现任意参数的单链表

    本文实例为大家分享了Java 8实现任意参数的单链表,供大家参考,具体内容如下 1.实现功能 1)add():链表末尾添加元素: 2)pop():移除链表尾部元素: 3)insert():指定索引处添加元素: 4)delete():指定索引处删除元素: 5)getSize():获取链表当前长度: 6)display():展示链表当前元素. 2.代码 package DataStructure; /** * @author: Inki * @email: inki.yinji@qq.com * @

  • Java实现带头结点的单链表

    链表的特点 1,以节点方式存储,是链式结构. 2,每个节点包含data域,next域:指向下一个节点. 3,链表的各个节点不一定是连续存储. 4,链表分为带头节点和不带头节点两种类型的链表. 实现原理 添加节点:如下图所示,首先遍历原有链表,找到最后一个节点,将要增加的节点添加到该节点的后面.下面介绍如何找到最后一个节点. 思路是这样的,先遍历整个链表,定义一个辅助变量temp,用于暂时存储遍历出来的各个节点.首先将head头节点赋给temp(从头节点开始遍历),通过一个死循环不断的遍历节点的n

  • Java 单链表数据结构的增删改查教程

    我就废话不多说了,大家还是直接看代码吧~ package 链表; /** * *1)单链表的插入.删除.查找操作: * 2)链表中存储的是int类型的数据: **/ public class SinglyLinkedList { private Node head = null; //查找操作 public Node findByValue(int value){ Node p = head; //从链表头部开始查找 while(p.next != null && p.data != va

  • Java实现双向循环链表

    双向循环链表定义 相比于单链表,有两个指针,next指针指向下一个结点,prior指针指向上一个结点,最后一个结点的next指针指向头结点,头结点的prior指针指向最后一个结点 代码实现: 我们对单链表的实现加以修改 package algorithm.datastructure.doublelinkedlist; import java.util.NoSuchElementException; /* * 双向循环链表 * 两个指针,next指针指向下一个结点,prior指针指向上一个结点,最

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

    分析过程: 首先需要比较待添加的节点编号与已有的节点编号的大小,若待添加的节点编号已经存在,则不能加入.为防止出现空指针的情况,需要对节点的位置进行判断. 示例代码: package linkedlist; public class DoubleLinkedListDemo { public static void main(String[] args) { // 测试 System.out.println("双向链表的测试"); // 创建节点 Node node1 = new No

  • PHP往XML中添加节点的方法

    本文实例讲述了PHP往XML中添加节点的方法.分享给大家供大家参考.具体方法如下: 1. contacts.xml代码 复制代码 代码如下: <contact id="43956">      <personal>           <name>                <first>J</first>                <middle>J</middle>             

  • layui-tree实现Ajax异步请求后动态添加节点的方法

    最近在弄一个产品分类管理,是一个树形菜单的形式,用的是layui-tree ,由于它并没有动态添加节点,所以只能自己刚了. 大概效果如图 体的实现是当我鼠标移入"长袖"这个分类时,出现三个icon (如图),按"增加"按钮,会发送ajax异步请求到后台,在数据库库中增加以"长袖"为父类id 的一个子分类,成功后返回到前台,然后相应的节点下动态添加子节点,主要是通过append 来增加html元素 <!DOCTYPE html> <

  • Java窗体居中显示的2种方法(实例讲解)

    第1种方法: //setSize(300, 200); pack(); // 得到显示器屏幕的宽.高 int width = Toolkit.getDefaultToolkit().getScreenSize().width; int height = Toolkit.getDefaultToolkit().getScreenSize().height; // 得到窗体的宽.高 int windowsWidth = this.getWidth(); int windowsHeight = thi

  • Java类和成员上的一些方法实例代码

    isInstance和isAssignableFrom obj instanceof Class 判断obj是不是Class或者Class的子类的实例 clazz.isInstance(obj) 判断obj能不能强制转换成clazz类型,亦即obj是不是clazz或者clazz的子类的实例 clazz1.isAssignableFrom(clazz2) 如果clazz2和clazz1相同,或者clazz1是clazz2的父类则返回True,否则返回Flase static class Paren

  • Python Django给admin添加Action的方法实例详解

    在使用Django自带的admin后台的时候,他提供了一些默认的指令可以对数据进行操作, 比如批量删除,修改等 同样的我们也可以添加自己的指令. 创建一个Django项目 $ django-admin startproject DjangoActions $ cd DjangoActions $ python3 manage.py startapp mysite添加model 打开mysite下的models.py from django.db import models class Artic

  • 在Java Web项目中添加定时任务的方法

    在Java Web程序中加入定时任务,这里介绍两种方式:1.使用监听器注入:2.使用Spring注解@Scheduled注入. 推荐使用第二种形式. 一.使用监听器注入 ①:创建监听器类: import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; public class TimerDataTaskListener implements ServletContextListener

  • Java获取服务器IP及端口的方法实例分析

    本文实例讲述了Java获取服务器IP及端口的方法.分享给大家供大家参考,具体如下: 前几天写过一个获取远程服务器的IP和端口的程序,从网上查了一些资料顺便加一些自己的理解,希望对大家有所帮助: struts2 获取request HttpServletRequest requet=ServletActionContext.getRequest(); requet.getScheme()+"://"+requet.getServerName()+":"+requet.

  • Java使用Condition控制线程通信的方法实例详解

    本文实例讲述了Java使用Condition控制线程通信的方法.分享给大家供大家参考,具体如下: 一 点睛 当使用Lock对象来保证同步时,Java提供了一个Condition类来保持协调,使用Condition可以让那些已经得到Lock对象.却无法继续执行的线程释放Lock对象,Condtion对象也可以唤醒其他处于等待的线程. Condition 将同步监视锁方法(wait.notify 和 notifyAll)分解成截然不同的对象,以便通过将这些对象与Lock对象组合使用,为每个对象提供多

  • java 获取用户的MAC地址多种方法实例详解

    java实现获取用户的MAC地址方法: 方法一:将本机地址与局域网内其他机器区分开来 /** * 根据IP地址获取mac地址 * @param ipAddress 127.0.0.1 * @return * @throws SocketException * @throws UnknownHostException */ public static String getLocalMac(String ipAddress) throws SocketException, UnknownHostEx

随机推荐