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中存储元素5
2、将B中的下一个节点修改为节点E
3、将E中的下一个节点赋值为节点C
从上述过程看,插入时没有节点位置移动的操作,所以效率比较高;删除的过程和插入过程相反;和双向链表的区别就是一个节点中不再存储上一个节点

实例代码:
/**
 * OneWayLinked类
 * 演示双向链表这一数据结构的实现
 * @author 学霸联盟 - 赵灿
 */
public class OneWayLinked {
	// 用于存储链表的第一个节点
	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.next = node;
		}
		//判断最后一个节点是否为null
		if(last == null){
			/*
			 * 如果最后一个节点也为null时
			 * last和first存储的是同一个Node对象的地址
			 */
			last = node;
		}else{
			//如果最后一个节点不为null
			//新创建的节点下一个节点存储自身
			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 next;
		// Object类型的变量,用于存储元素
		Object element;
	}
}

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

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

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集合框架之Map集合

Map接口 Map集合采用键值对(key-value)的方式存储数据,其中键不可以重复.值可以重复. 常用类有HashMap.TreeMap和Properties HashMap类 假如,现在我有一个集合,集合中存储着一批WiFi的名称和密码,现在要求通过名称快速找到密码.这样的需求使用List集合实现起来非常困难,Java为我们提供了另一种形式的集合,可以很好的解决这样的问题.就是Map集合. 实例: package map.hashMap; import java.util.HashMap;

I学霸官方免费教程二十七:Java基础教程之Arrays类

Arrays类 数组的一个工具类,提供了一些静态的方法,用于操作数组:不多说,直接上例子 实例: //声明包 package array; //导入包 //作用:告诉系统,ArraysDemo类中用到Arrays类时去java.util包下找Arrays类 import java.util.Arrays; /**  * 演示Arrays类的常用方法  * @author 学霸联盟 - 赵灿  */ public class ArraysDemo { public static void main

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

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

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

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

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

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

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基础教程之线程

线程 线程和进程 进程:系统运行程序的最小单位:一个进程最少有一个线程线程:程序执行任务的最小单位:线程与线程之间并行一个进程至少有一个线程,在java中这个线程称为主线程,由系统创建,运行main方法.这样只有一个线程的程序也被称为单线程程序.主线程从程序入口main方法开始执行代码,执行任意方法中的代码都是按照自上而下的顺序执行的,如果只有一个主线程,又想实现在线听音乐这个功能的话,就很难实现.因为主线程必须先去下载音乐:下载完成后,在执行播放音乐:这显然不能满足当今人们对在线听音乐的需求.