java实现循环链表

简介: 前面已经介绍了java实现单链表:http://www.cnblogs.com/lixiaolun/p/4643886.html 其实两者的主要差别就在于如何判断是否到了链表的结尾: 在单链表中 while(temp.

前面已经介绍了java实现单链表:http://www.cnblogs.com/lixiaolun/p/4643886.html

其实两者的主要差别就在于如何判断是否到了链表的结尾:

在单链表中

while(temp.next!=null)
{
	temp=temp.next;
}

在循环链表中

while(temp.next!=header)
{
	temp=temp.next;
}

 

下面是循环链表的代码和测试代码:

循环链表的代码:

package circularlinkedlist;

public class CircularLinkedList {
	
	class Element
	{
		public Object value=null;
		private Element next=null;
	}
	private Element header = null;//头结点
	/**
	 * 初始化链表
	 * */
	void initList()
	{
		header = new Element();
		header.value=null;
		header.next=header;
	}
	
	/**
	 * 插入链表
	 * */
	void insertList(Object o)
	{
		Element e=new Element();
		e.value=o;
		if(header.next==header)//第一次插入元素
		{
			header.next=e;
			e.next=header;
		}else//不是第一次插入元素
		{
			//temp引用在栈中,temp和header引用都指向堆中的initList()中new的Element对象
			Element temp = header;
			while(temp.next!=header)//寻找最后一个元素
			{
				temp=temp.next;
			}
			temp.next=e;
			e.next=header;//新插入的最后一个节点指向头结点
		}
	}
	
	/**
	 * 删除链表中第i个元素
	 * */
	void deletelist(Object o)
	{
		Element temp =header;
		while(temp.next!=header)
		{
			//判断temp当前指向的结点的下一个结点是否是要删除的结点
			if(temp.next.value.equals(o))
			{
				temp.next=temp.next.next;//删除结点
			}else
			{
				temp=temp.next;//temp“指针”后移
			}
		}
	}
	
	/**
	 * 获取链表的第i个位置的元素
	 * */
	Element getElement(int i)
	{
		if(i<=0 || i>size())
		{
			System.out.println("获取链表的位置有误!返回null");
			return null;
		}
		else
		{
			int count =0;
			Element element = new Element();
			Element temp = header;
			while(temp.next!=header)
			{
				count++;
				if(count==i)
				{
					element.value=temp.next.value;
				}
				temp=temp.next;
			}
			return element;
		}
	}
	/**
	 * 链表长度
	 * */
	int size()
	{
		Element temp = header;
		int size=0;
		while(temp.next!=header)
		{
			size++;
			temp=temp.next;
		}
		return size;
	}
	
	/**
	 * 判断链表中是否存在某元素
	 * */
	Boolean isContain(Object o)
	{
		Element temp =header;
		while(temp.next!=header)
		{
			if(temp.next.value.equals(o))
			{
				return true;
			}
			temp=temp.next;
		}
		return false;
	}
	/**
	 * 打印链表
	 * */
	void print()
	{
		System.out.print("打印链表:");
		Element temp =header;
		while(temp.next!=header)
		{
			temp=temp.next;
			System.out.print(temp.value+"\t");
		}
		System.out.println();
	}
}

测试代码:

package circularlinkedlist;

public class CircularLinkedListMain {

	public static void main(String[] args) {
		CircularLinkedList clList = new CircularLinkedList();
		clList.initList();
		clList.insertList(1);
		clList.insertList(2);
		clList.insertList(3);
		clList.insertList(4);
		clList.insertList(5);
		clList.print();
		
		System.out.println("链表长度:"+clList.size());
		clList.deletelist(1);
		clList.deletelist(5);
		clList.print();
		System.out.println("第1个元素值为:"+clList.getElement(1).value);
		System.out.println("第2个元素值为:"+clList.getElement(2).value);
		System.out.println("第3个元素值为:"+clList.getElement(3).value);
	
		System.out.println(clList.isContain(2));
		System.out.println(clList.isContain(6));
//		System.out.println(clList.isContain(5));
	}

}

  

目录
相关文章
|
Java
Java编程:理解while循环的使用
总结而言, 使用 while 迴圈可以有效解决需要多次重复操作直至特定條件被触发才停止執行任务场景下问题; 它简单、灵活、易于实现各种逻辑控制需求但同时也要注意防止因邏各错误导致無限迁璇発生及及時處理可能発生异常以确保程序稳定运作。
696 0
|
存储 Java
|
传感器 安全 Java
《从头开始学java,一天一个知识点》之:循环结构:for与while循环的使用场景
**你是否也经历过这些崩溃瞬间?** - 看了三天教程,连`i++`和`++i`的区别都说不清 - 面试时被追问&quot;`a==b`和`equals()`的区别&quot;,大脑突然空白
521 22
Java快速入门之判断与循环
本文介绍了编程中的流程控制语句,主要包括顺序结构、判断结构(if语句和switch语句)以及循环结构(for、while和do...while)。通过这些语句可以精确控制程序的执行流程。if语句有三种格式,分别用于简单条件判断、二选一判断和多条件判断。switch语句适用于有限个离散值的选择判断,而循环结构则用于重复执行某段代码,其中for循环适合已知次数的情况,while循环适合未知次数但有明确结束条件的情况,do...while则是先执行后判断。文中还提供了多个示例和练习,帮助读者理解并掌握这些重要的编程概念。
|
Java 程序员 API
Java循环操作哪个快?
本文探讨了Java中Stream API与传统for循环的性能对比及适用场景。作者通过实际案例分析,指出在某些情况下,过度使用Stream API会导致代码可读性和维护性下降。测试结果显示,在数据量较小的情况下,普通for循环的性能优于Stream API,尤其是在涉及多次类似操作时。因此,建议在开发中根据具体需求选择合适的遍历方式,以提高代码的可读性和性能。
446 5
Java循环操作哪个快?
|
Java 程序员 API
Java循环操作哪个快?
本文探讨了Java中stream API与传统for循环在性能上的对比,通过多个示例分析了不同场景下两者的优劣。作者指出,尽管stream API使代码更简洁,但不当使用会降低可读性和性能,特别是在处理大数据量时。实验结果显示,在多数情况下,普通for循环的性能优于stream API,尤其是在单次操作耗时较短但需多次执行的场景中。文章建议开发者在设计初期就考虑全局流程,避免重复使用stream流,以提升代码质量和性能。
508 1
Java循环操作哪个快?
|
Java
java基础(2)循环语句for、while、do...while
本文介绍了Java中的基础循环语句,包括for循环、while循环和do...while循环。文章通过示例代码展示了for循环的基本结构和用法,while循环的先判断后执行逻辑,以及do...while循环的先执行后判断逻辑。这些循环语句在Java编程中非常常用,用于执行重复的任务。
324 4
java基础(2)循环语句for、while、do...while
java数据结构,双向链表的实现
文章介绍了双向链表的实现,包括数据结构定义、插入和删除操作的代码实现,以及双向链表的其他操作方法,并提供了完整的Java代码实现。
java数据结构,双向链表的实现
|
算法 Java 测试技术
🧑‍💻Java零基础:Java 的循环退出语句 break
【10月更文挑战第16天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
517 6