java实现双向循环链表

简介: java实现循环链表:http://www.cnblogs.com/lixiaolun/p/4643911.html 在单链表中,查询下一个元素的时间是O(1)。查询上一个元素的时间却是O(n)。 为了克服这种缺点,我们开始学习双向链表。

java实现循环链表:http://www.cnblogs.com/lixiaolun/p/4643911.html

在单链表中,查询下一个元素的时间是O(1)。查询上一个元素的时间却是O(n)。

为了克服这种缺点,我们开始学习双向链表。

双向链表类的代码:

package doublelinkedlist;

public class DoubleLinkedList {
	
	class Element
	{
		private Element prior=null;
		public Object value=null;
		private Element next=null;
	}
	
	private Element header = null;//头结点
	
	/**
	 * 初始化链表
	 * */
	void initList()
	{
		header = new Element();
		header.prior=header;
		header.value=null;
		header.next=header;
	}
	
	/**
	 * 向链表中第i个位置插入元素o
	 * */
	void insertList(Object o,int i)
	{
		if(i<=0||i>size())
		{
			System.out.println("插入位置不合法!链表长度为:"+size());
		}else
		{
			Element e = new Element();
			e.value=o;
			if(header.prior==header)//第一次插入元素
			{
				e.prior=header;
				e.next=header;
				header.next=e;
				header.prior=e;
			}else if(i==size())//在最后插入
			{
				System.out.println("在链表尾部插入");
				e.next=header;
				e.prior=header.prior;
				header.prior.next=e;
				header.prior=e;
				
			}else
			{
				Element temp = header;
				int count=0;
				while(temp.next!=header)
				{
					count++;
					if(count == i)
					{
						e.prior=temp;
						e.next=temp.next;
						temp.next.prior=e;
						temp.next=e;
					}
					temp=temp.next;
				}
			}
		}
		
	}
	/**
	 * 删除链表中的某个元素
	 * */
	void deleteList(int i)
	{
		if(i<=0||i>size())
		{
			System.out.println("插入位置不合法!链表长度为:"+size());
		}else
		{
			int count=0;
			Element temp = header;
			while(temp.next!=header)
			{
				temp=temp.next;
				count++;
				if(i==count)
				{
					//删除第i个元素
					temp.next.prior=temp.prior;
					temp.prior.next=temp.next;
				}
			}
		}
	}
	/**
	 * 打印链表
	 * */
	void print()
	{
		System.out.print("打印双向循环链表:");
		Element temp = header;
		while(temp.next!=header)
		{
			System.out.print(temp.next.value+"\t");
			temp=temp.next;
		}
		System.out.println();
	}
	/**
	 * 获取链表的大小
	 * */
	int size()
	{
		int count=1;
		Element temp = header;
		while(temp.next!=header)
		{
			count++;
			temp=temp.next;
		}
		return count;
	}
}

双向链表的测试类

package doublelinkedlist;

public class DoubleLinkedListMain {

	public static void main(String[] args) {
		DoubleLinkedList dlList = new DoubleLinkedList();//有头结点
		dlList.initList();
		dlList.insertList(1, 1);
		dlList.insertList(2, 2);
		dlList.insertList(3, 1);
		dlList.insertList(4, 1);
		dlList.insertList(5, 1);
		dlList.insertList(6, 6);
		dlList.print();
		dlList.deleteList(3);
		dlList.print();
	}

}

  

目录
相关文章
|
1月前
|
Java
Java周期循环的代码可以如此简单
Java周期循环的代码可以如此简单
27 2
|
2月前
|
Java
Java移除链表元素
Java移除链表元素
27 0
|
3月前
|
C++ Python Java
Java每日一练(20230501) 路径交叉、环形链表、被围绕的区域
Java每日一练(20230501) 路径交叉、环形链表、被围绕的区域
35 0
Java每日一练(20230501) 路径交叉、环形链表、被围绕的区域
|
1月前
|
Java 数据库连接 API
Java 学习路线:基础知识、数据类型、条件语句、函数、循环、异常处理、数据结构、面向对象编程、包、文件和 API
Java 是一种广泛使用的、面向对象的编程语言,始于1995年,以其跨平台性、安全性和可靠性著称,应用于从移动设备到数据中心的各种场景。基础概念包括变量(如局部、实例和静态变量)、数据类型(原始和非原始)、条件语句(if、else、switch等)、函数、循环、异常处理、数据结构(如数组、链表)和面向对象编程(类、接口、继承等)。深入学习还包括包、内存管理、集合框架、序列化、网络套接字、泛型、流、JVM、垃圾回收和线程。构建工具如Gradle、Maven和Ant简化了开发流程,Web框架如Spring和Spring Boot支持Web应用开发。ORM工具如JPA、Hibernate处理对象与数
94 3
|
1月前
|
Java
java使用循环案例—
java使用循环案例—
9 0
|
1月前
|
存储 Java
Java链表
Java链表
11 0
|
1月前
|
Java 开发者 Spring
【Java】Spring循环依赖:原因与解决方法
【Java】Spring循环依赖:原因与解决方法
39 0
|
1月前
|
算法 Java 索引
[Java·算法·简单] LeetCode 141. 环形链表 详细解读
[Java·算法·简单] LeetCode 141. 环形链表 详细解读
23 0
|
1月前
|
存储 Java 容器
深入Java核心:变量、循环与条件语句的魔法
深入Java核心:变量、循环与条件语句的魔法
13 0
|
1月前
|
存储 算法 Java
【数据结构与算法】2、链表(简单模拟 Java 中的 LinkedList 集合,反转链表面试题)
【数据结构与算法】2、链表(简单模拟 Java 中的 LinkedList 集合,反转链表面试题)
43 0