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