java實現雙向循環鏈表


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();
	}

}

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM