java数据结构基础:单链表与双向链表

 更新时间:2021年08月01日 10:58:51   作者:去吧猫头夜鹰  
这篇文章主要为大家详细介绍了java实现单链表、双向链表的相关资料,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

单链表:

每个数据是以节点的形式存在的

每个节点分为数据域和指针域

数据域中保存该节点的数据

指针域中保存指向下一个节点的指针

实现思路:

节点类SingleNode中保存数据和指向下一个节点的指针

单链表类SingleLinkedList中保存链表的头节点,实现相关链表方法

对于链表方法,涉及到位置查找,如在指定位置增加、删除节点,需要使用一个临时变量temp从头节点开始遍历,直至找到对应的位置。

对于节点的增加删除,只需要修改相关结点的指针指向即可

代码实现:

节点类SingleNode:

public class SingleNode {
	public int data;
	public SingleNode next;
	public SingleNode(int data) {
		this.data = data;
	}
	@Override
	public String toString() {
		return "SingleNode{" + "data=" + data + '}';
	}
}

单链表类SingleLinkedList

public class SingleLinkedList {
	private SingleNode head = new SingleNode(0);
    //获取头结点
	public SingleNode getHead(){
		return head;
	}
	//添加节点
	public void add(SingleNode singleNode) {
		SingleNode temp = head;
		//找到链表最后一个节点
		while (temp.next != null) {
			temp = temp.next;
		}
		temp.next = singleNode;
	}
	//按顺序添加节点
	public void addByOrder(SingleNode singleNode) {
		SingleNode temp = head;
		while (true) {
			if (temp.next == null) {
				//已经遍历到链表最后了
				break;
			} else if (temp.next.data > singleNode.data) {
				//找到应插入的位置
				break;
			}
			temp = temp.next;
		}
		singleNode.next = temp.next;
		temp.next = singleNode;
	}
	//删除节点
	public void delete(int data) {
		SingleNode temp = head;
		boolean flag = false;    //标志是否找到待删除节点的前一个节点
		while (true) {
			if (temp.next == null) {
				//已经遍历到链表最后了
				break;
			} else if (temp.next.data == data) {
				//找到待删除节点的前一个节点
				flag = true;
				break;
			}
			temp = temp.next;
		}
		if (flag) {
			temp.next = temp.next.next;
		} else {
			System.out.println("要删除的节点不存在");
		}
	}
	//输出链表
	public void show() {
		//判断链表是否为空
		if (head.next == null) {
			System.out.println("链表为空");
			return;
		}
		SingleNode temp = head.next;
		while (temp != null) {
			System.out.println(temp);
			temp = temp.next;
		}
	}
}

双向链表:

每个节点中除了保存了指向后一个节点的指针外,还保存了指向前一个节点的指针

实现思路:

相关方法实现与单链表类似,不同点在于需要增加对指向前一个节点的指针的更改

代码实现:

节点类DoubleNode:

public class DoubleNode {
	public int data;
	public DoubleNode next;
	public DoubleNode pre;
	public DoubleNode(int data) {
		this.data = data;
	}
	@Override
	public String toString() {
		return "DoubleNode{" + "data=" + data + '}';
	}
}

双向链表类DoubleLinkedList:

public class DoubleLinkedList {
	public DoubleNode head = new DoubleNode(0);
	//获取头结点
	public DoubleNode getHead() {
		return head;
	}
	//添加节点
	public void add(DoubleNode doubleNode) {
		DoubleNode temp = head;
		//找到链表最后一个节点
		while (temp.next != null) {
			temp = temp.next;
		}
		temp.next = doubleNode;
		doubleNode.pre = temp;
	}
	//删除节点
	public void delete(int data) {
		DoubleNode temp = head.next;
		boolean flag = false;    //标志是否找到待删除节点的前一个节点
		while (true) {
			if (temp == null) {
				//已经遍历到链表最后了
				break;
			} else if (temp.data == data) {
				//找到待删除节点
				flag = true;
				break;
			}
			temp = temp.next;
		}
		if (flag) {
			temp.pre.next = temp.next;
			if (temp.next != null) {
				//若删除节点不为最后一个节点
				temp.next.pre = temp.pre;
			}
		} else {
			System.out.println("要删除的节点不存在");
		}
	}
	//输出链表
	public void show() {
		//判断链表是否为空
		if (head.next == null) {
			System.out.println("链表为空");
			return;
		}
		DoubleNode temp = head.next;
		while (temp != null) {
			System.out.println(temp);
			temp = temp.next;
		}
	}
}

总结

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注脚本之家的更多内容!

相关文章

  • java反射常用方法案例详解

    java反射常用方法案例详解

    Java反射指的是一个机制,这种机制可以在Java程序运行时(动态)实例化对象、读写属性、调用方法,这篇文章主要介绍了java反射常用方法,需要的朋友可以参考下
    2023-06-06
  • 在VSCode里使用Jupyter Notebook调试Java代码的详细过程

    在VSCode里使用Jupyter Notebook调试Java代码的详细过程

    Jupyter Notebook是以网页的形式打开,可以在网页页面中直接编写代码和运行代码,代码的运行结果也会直接在代码块下显示的程序,这篇文章主要介绍了在VSCode里使用Jupyter Notebook,调试Java代码,需要的朋友可以参考下
    2022-07-07
  • Spring WebFlux实现参数校验的示例代码

    Spring WebFlux实现参数校验的示例代码

    请求参数校验,在实际的应用中很常见,网上的文章大部分提供的使用注解的方式做参数校验。本文主要介绍 Spring Webflux Function Endpoint 使用 Spring Validation 来校验请求的参数。感兴趣的可以了解一下
    2021-08-08
  • 批量将现有Jar包上传到Maven私服

    批量将现有Jar包上传到Maven私服

    今天小编就为大家分享一篇关于批量将现有Jar包上传到Maven私服,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • Java执行shell命令的实现

    Java执行shell命令的实现

    本文主要介绍了Java执行shell命令的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • JavaMe开发绘制可自动换行文本

    JavaMe开发绘制可自动换行文本

    JavaMe Graphics类中的drawString不支持文本换行,这样绘制比较长的字符串时,文本被绘制在同一行,超过屏幕部分的字符串被截断了。如何使绘制的文本能自动换行呢?
    2015-09-09
  • java.lang.NumberFormatException异常解决方案详解

    java.lang.NumberFormatException异常解决方案详解

    这篇文章主要介绍了java.lang.NumberFormatException异常解决方案详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • Java检查日期字符串是否合法的方法总结

    Java检查日期字符串是否合法的方法总结

    后端接口在接收数据的时候,都需要进行检查。检查全部通过后,才能够执行业务逻辑。本文总结了四个Java检查日期字符串是否合法的方法,感兴趣的可以了解一下
    2022-10-10
  • java中实现Comparable接口实现自定义排序的示例

    java中实现Comparable接口实现自定义排序的示例

    下面小编就为大家带来一篇java中实现Comparable接口实现自定义排序的示例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • Mybatis Mapper接口和xml绑定的多种方式、内部实现原理和过程解析

    Mybatis Mapper接口和xml绑定的多种方式、内部实现原理和过程解析

    在Mybatis中,我们需要创建一个与实体类对应的Mapper接口,然后在该接口上添加方法,这些方法对应着SQL语句,这篇文章主要介绍了Mybatis Mapper接口和xml绑定的多种方式、内部实现原理和过程,需要的朋友可以参考下
    2023-11-11

最新评论