zoukankan      html  css  js  c++  java
  • 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+"	");
    			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();
    	}
    
    }
    

      

  • 相关阅读:
    QT 信号与槽 中传递自定义数据类型
    keil5 仿真时发现函数不能进入到main函数
    QT 报错分析 一
    QT 简易时间处理
    QT 编译出现 Custom Executable 对话框 问题
    win10 下装ubuntu双系统
    Vmware linux下不能联网
    Vmware Workstation
    免费在线作图,实时协作
    SVN常用问题汇总
  • 原文地址:https://www.cnblogs.com/lixiaolun/p/4643931.html
Copyright © 2011-2022 走看看