アルゴリズムとデータ構造【Java】:ループチェーンテーブル


1、定義:循環チェーンテーブルは首尾が接続されたチェーンテーブルであり、それ自体は首尾がないが、チェーンテーブルに入口を提供するため、チェーンテーブルの操作を容易にするために、「頭」と「尾」を定義した2、循環チェーンテーブルは一方向チェーンテーブルで簡単な変更で実現できるが、ここでは単独で循環チェーンテーブルを実現した.3、循環チェーンテーブルの使用例:オペレーティングシステムのタスクスケジューリング時、同じ優先度のタスクは同じ時間のCPU使用権を獲得し、一つのタスクがCPUを占有し終わった後、次のタスクにCPUを譲る必要がある.このように循環して、循環チェーンテーブルに使用することができる.
以下はJavaコードです.
package com.circularLinkedList;

//     
public class CircularLinkedList {
	Node head;		//      
	//              ,          ,         ,         
	Node tail;		//      
	int length;		//    
	
	public CircularLinkedList(){
		head = null;
		tail = null;
		length = 0;
	}
	
	//        
	int isEmpty(){
		return head==null ? 1:0;
	}
	
	//           
	int contains(int value){
		//        
		for (Node now=head; now.next!=head; now=now.next)
			if(now.value == value)
				return 1;
		return 0;
	}
	
	//       
		void addToHead(int value){
			Node tmp = new Node(value);
			//      ,  head tail
			if(head == null){
				tmp.next = tmp;
				head = tail = tmp;
			}
			//     head
			else{
				tmp.next = head;
				tail.next = tmp;	
				head = tmp;			
			}
			length++;
		}
	
		//       
		void addToTail(int value){
			Node tmp = new Node(value);
			//      ,  head tail
			if (head==null){
				tmp.next = tmp;
				head = tail = tmp;
			}
			//     tail
			else {
				tmp.next = head;
				tail.next = tmp;	
				tail = tmp;	
			}
			length++;
		}
	
		//                  ,   1  , length  
		void addNode(int value, int index){
			//     ,    
			if (index<=0 || index>length+1)
				return ;
			
			//      ,         (        addToHead)
			if (head==null && index==1){
				Node tmp = new Node(value);
				tmp.next = tmp;
				head = tail = tmp;
			}	
			//          ,  addToHead
			else if (index==1){
				addToHead(value);
			}
			//          ,  addToTail
			else if (index==length+1)
				addToTail(value);
			//  ,         
			else{
				//   ,     
				int cnt=0;
				//      
				Node tmp = new Node(value);
				//           
				Node aheadOfAdd=null;
				//               
				for (cnt=1,aheadOfAdd=head; cnt+1length || head==null)
				return -1;	

			//        ,  deleteFromHead
			if (index==1)
				return deleteFromHead();
			//        ,     1,    
			else if(head == tail && index!=-1)
				return -1;
			//        ,    deleteFromTail
			else if(index==length)
				return deleteFromTail();
			//    
			else{
				//   ,                  
				int cnt=0;
				//            
				Node aheadOfDelete=null;
				//       
				for(cnt=1,aheadOfDelete=head; cnt+1next         ,          
		void printSelf(){
			int cnt=0;
			Node now=null;
			System.out.print("CircularLinkedList: [");
			for (now=head,cnt=1; cnt<=length; cnt++,now=now.next)
				System.out.print(now.value + " ");
			
			System.out.print("]
"); if (isEmpty()==0) { String str = String.format("\t\ttail->next: %d\tlength: %d %d
", tail.next.value, length, isEmpty()); System.out.print(str); } else System.out.print("\t\tEmpty CircularLinkedList
"); } static public void main(String[] argv) { CircularLinkedList list = new CircularLinkedList(); list.addToHead(123);list.printSelf(); list.addToHead(124);list.printSelf(); list.addToHead(125);list.printSelf(); list.addToTail(1);list.printSelf(); list.addToTail(2);list.printSelf(); list.addToTail(3);list.printSelf(); list.addNode(10000,1);list.printSelf(); list.addNode(10001,2);list.printSelf(); list.addNode(10005,9);list.printSelf(); System.out.println("deletedValue: " + list.deleteNode(9));list.printSelf(); //list.deleteFromHead();list.printSelf(); //System.out.println("deleting!"); } } class Node{ int value; // Node next; // // public Node(int aValue){ value = aValue; next = null; } public Node(int aValue, Node aNext){ value = aValue; next = aNext; } };