I学霸官方免费教程三十六:Java数据结构之双向链表结构

数据结构之双向链表

例如:现有双向链表TwoWayLinked中存储着1,2,3,4四个元素,那么集合对象中会有4个节点A、B、C、D,由上述结构可以知道,节点A中存储着元素1和节点B;节点B中存储着元素2和节点A和节点C,节点C中存储着元素3和节点B和节点D,节点D中存储着元素4和节点C。如果现在要在元素2和3中间插入一个元素5;

过程如下:

1、创建节点E,E中存储元素5

2、将E中的上一个节点赋值为节点B

3、将B中的下一个节点修改为节点E

4、将E中的下一个节点赋值为节点C

5、将C中的上一个节点修改为节点E

从上述过程看,插入时没有节点位置移动的操作,所以效率比较高;删除的过程和插入过程相反

实例代码:
/**
 * TwoWayLinked类
 * 演示双向链表这一数据结构的实现
 * @author 学霸联盟 - 赵灿
 */
public class TwoWayLinked {
	// 用于存储链表的第一个节点
	private Node first = null;
	// 用于存储链表的最后一个节点
	private Node last = null;
	// 用于存储集合长度
	private int size = 0;

	//添加元素的方法
	public void add(Object obj){
		//创建节点对象
		Node node = new Node();
		//节点中存储添加的元素
		node.element = obj;
		//判断第一个节点是否为null
		if (first == null) {
			//第一个节点为说明是第一次添加元素
			first = node;
			//将第一个节点的前一个和后一个节点都设置成自己
			first.pre = node;
			first.next = node;
		}
		//判断最后一个节点是否为null
		if(last == null){
			/*
			 * 如果最后一个节点也为null时
			 * last和first存储的是同一个Node对象的地址
			 */
			last = node;
		}else{
			//如果最后一个节点不为null
			//新创建的节点前一个节点应该是上一次的最后一个节点
			node.pre = last;
			//新创建的节点下一个节点存储自身
			node.next = node;
			//此时last中保存的还是上一次添加元素时的最后一个节点
			//所以它的下一个节点应该设置为当前新建的节点
			last.next = node;
			//然后将last设置为当前新建的节点
			last = node;
		}
		//添加元素,长度加1
		size++;
	}
	/**
	 * 根据下标获取元素
	 */
	public Object get(int index) {
		//首先判断传入的下标是否超出长度
		if (index < size) {
			/*
			 * 声明一个Node类型的变量tagNode,并设置为first
			 * 表示寻找的时候从第一个节点开始找
			 */
			Node tagNode = first;
			for (int i = 0; i < index; i++) {
				//获取下一个节点,等价于i+1
				tagNode = tagNode.next;
			}
			//获取找到的节点中的元素
			return tagNode.element;
		}
		//如果传入的下标大于或等于长度,返回null
		return null;
	}

	/**
	 * 节点类(私有的成员内部类)
	 *
	 * @author 学霸联盟 - 赵灿
	 */
	private class Node {
		// 自身类型的变量,用于存储前一个节点
		Node pre;
		// 自身类型的变量,用于存储后一个节点
		Node next;
		// Object类型的变量,用于存储元素
		Object element;
	}
}

/**
 * TwoWayLinkedTest类
 * 用于测试双向链表
 * @author 学霸联盟 - 赵灿
 */
public class TwoWayLinkedTest {
	public static void main(String[] args) {
		//创建双线链表的对象
		TwoWayLinked twl = new TwoWayLinked();
		//向链表中添加值
		twl.add(1);
		twl.add(2);
		twl.add(3);
		twl.add(4);
		//获取下标为2的值
		Object element = twl.get(2);
		//输出值
		System.out.println(element);
	}
}
运行结果:
3

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-08 01:00:43

I学霸官方免费教程三十六:Java数据结构之双向链表结构的相关文章

I学霸官方免费教程三十:Java集合框架之List集合

集合框架 在数组的使用过程中可以看到,想要向数组中插入元素和删除元素非常麻烦,而且数组的长度是无法改变的.java为我们提供了批量存储数据更加方便的容器,就是集合. 集合和数组的作用一样,都是为了使用一个变量来存储一批数据的:但集合使用起来更加方便,而且集合的长度是可以变化的. List接口 List集合可以存储有序的,可重复的数据: 常用的子类是ArrayList和LinkedList两个类 ArrayList类 这是一个底层由数组实现的集合类,是对数组进行了封装. 实例: package c

I学霸官方免费教程三十:Java基础教程之泛型

泛型 先给大家举个例子:如现在有一家工厂,可以生产手机,也可以生产电脑.以后还可能生产其他产品.如果给某个工厂加上了泛型,就规定了这个工厂只能生产手机或电脑,不能再生产其他产品了. 实例: package generic; /**  * 产品枚举Product  * @author 学霸联盟 - 赵灿  */ public enum Product { 手机,电脑 } package generic; /**  * 手机类Phone  * @author 学霸联盟 - 赵灿  */ public

I学霸官方免费教程三十七:Java数据结构之单向链表结构

数据结构之单向链表 例如:现有双向链表OneWayLinked中存储着1,2,3,4四个元素,那么集合对象中会有4个节点A.B.C.D,由上述结构可以知道,节点A中存储着元素1和节点B:节点B中存储着元素2和节点C,节点C中存储着元素3和节点D,节点D中存储着元素4和null.如果现在要在元素2和3中间插入一个元素5:过程如下:1.创建节点E,E中存储元素52.将B中的下一个节点修改为节点E3.将E中的下一个节点赋值为节点C从上述过程看,插入时没有节点位置移动的操作,所以效率比较高:删除的过程和

I学霸官方免费教程三十二:Java集合框架之Set集合

Set接口 Set集合是无序的.元素不可重复的结合常用集合类有HashSet和TreeSet HashSet类常用的两种List集合各有各的优点,那么有没有同时具备这两种List集合的优点的集合呢?答案是肯定的,就是Set集合. 实例: package collection.set.hashSet; import java.util.HashSet; import java.util.Iterator; /**  * 演示HashSet  * @author 学霸联盟 - 赵灿  */ publ

I学霸官方免费教程三十一:Java集合框架之List集合

集合框架 在数组的使用过程中可以看到,想要向数组中插入元素和删除元素非常麻烦,而且数组的长度是无法改变的.java为我们提供了批量存储数据更加方便的容器,就是集合.集合和数组的作用一样,都是为了使用一个变量来存储一批数据的:但集合使用起来更加方便,而且集合的长度是可以变化的. List接口 List集合可以存储有序的,可重复的数据:常用的子类是ArrayList和LinkedList两个类 ArrayList类 这是一个底层由数组实现的集合类,是对数组进行了封装. 实例: package col

I学霸官方免费教程二十六:Java基础教程之数组

数组 举例:假如现在有十个人排成一队[张三,李四,王五--],这个队的队名叫A,然后要求第一个人从0开始报数[张三报0,李四报1,王五报2--].现在要求第一个人出列,但现在还不知道张三的名字,怎么办?那么只能要求A队0号出列.请问此时谁会出列?很明显是张三出列.这对人就形成了类似数组的结构:其中队名A就对应数组名,各个人报的号就对应数组的下标,而每个人就对应数组中的元素,人的个数就对应数组的长度.在程序设计中,把具有相同类型的若干个变量按有序的形式组合在一起,仅使用一个变量名来存储这些元素,用

I学霸官方免费教程三十四:Java集合框架之泛型集合

泛型集合 泛型集合不是指某种集合,而是指在集合的基础上增加了泛型. 泛型集合中,一旦传入了泛型参数"类A":则只能向这个集合中添加类A或类A子类的对象,不能添加其他对象了. 从泛型集合中获取对象时,对象的类型是类A,而不是Object类型的对象了. 泛型List 例如:上面说到的两种List集合,都可以加入泛型 package collection.list.arrayList; import java.util.ArrayList; import java.util.List; /*

I学霸官方免费教程三十五:Java集合框架之Collection接口和Collections类

Collection接口 Collection接口是List和Set接口的父接口,其中主要定义了一些集合基本操作的方法,包括与Iterator之间的关系List  extends  CollectionArrayList  implements  ListLinkedList  implements  ListVector  implements  ListSet  extends  CollectionHashSet  implements  SetSortedSet  extends  Se

I学霸官方免费教程三十八 :Java基础教程之异常

异常 程序中不正常的情况分为两大类:错误(Error)和异常(Exception) 错误(Error):程序本身无法对这种不正常的情况进行处理,将会导致程序崩溃:例如:内存耗尽错误,JVM崩溃错误等异常(Exception):程序可以特殊的代码,对不正常的情况进行捕获和处理,程序可以继续运行:例如:除零异常,空指针异常,数组下标越界异常 捕获异常 语法格式1: try{  //可能出现异常的代码   }catch(异常类 变量名){ //出现异常后的处理代码 //printStackTrace(