【データ構造】JavaによるチェーンテーブルクラスLinkListの実装

78576 ワード

目次
  • チェーンテーブル紹介
  • Java->チェーンテーブルAPI
  • Java->チェーンテーブルコード
  • チェーンテーブル使用例
  • チェーンテーブルの紹介
    Javaインプリメンテーションのシーケンステーブルを知りたい場合は、ここをスタンプします:【データ構造】JavaインプリメンテーションシーケンステーブルクラスSeqListを使用します
    上記で紹介したシーケンステーブルはデータストレージ構造として多くの利点があり,最も重要なのはシーケンステーブルの要素がランダムにアクセスされることである.しかしシーケンステーブルにも多くの欠点があり,主な欠点は2つあり,1つは挿入と削除の効率が低下し,挿入と削除操作には部分要素の位置を変化させる必要があり,時間的複雑度はO(n)である.2つ目は、データが作成されるとサイズを変更することはできません.配列の容量を拡大するには、新しいより大きな新しい配列を作成し、元の配列を新しい配列にコピーする必要があります.これはとても不便です.
    そこで上記の問題を解決するために、チェーンテーブルが現れ、チェーンテーブルの主な特徴は:1、チェーンテーブルの大きさは動的で、データの増加あるいは削除に伴って動的に長さを変える.2、チェーンテーブルの挿入、削除は非常に効率的で、常にデータの挿入と削除を必要とする応用に対して、チェーンテーブルをデータストレージ構造として使用するのに非常に適している.
    シーケンステーブルとチェーンテーブルは線形テーブルに属します.
    Java->チェーンテーブルAPI
    コードを見る前に、チェーンテーブルがどのようなタスクを完了する必要があるか、つまりチェーンテーブルのAPIを見てみましょう.これはコードの理解に役立ち、自分が実現したい機能を迅速に検索するのに役立ちます.
  • LinkList():コンストラクション関数
  • clear():リスト全体を削除
  • removeAll():リスト全体を削除し、clear関数を呼び出して
  • を実現します.
  • getNode(int i):論理的i番ノード
  • を取得する.
  • get(int i):論理上のi番ノードの値
  • を取得する.
  • set(int i,Tx):i番ノードの値
  • を変更する
  • add(int i,Tx):値xのノードをi番位置
  • に挿入する.
  • add(T key):チェーンテーブルの末尾に要素key
  • を挿入する
  • addBack(T key):チェーンテーブルの末尾に要素keyを挿入し、add(T key)関数と同様に
  • addFront(T key):チェーンテーブルの先頭に要素key
  • を挿入する
  • remove(int i):i番ノードを削除し、i番ノードに対応する値
  • を返します.
  • remove():removeを再ロードし、ヘッダノード
  • を削除する.
  • removeFront():チェーンヘッダーノードを削除し、remove()関数と同義
  • removeBack():チェーンテーブルの末尾ノード
  • を削除
  • addSort(T value):値valueを小さい順にチェーンテーブル
  • に挿入する.
  • sort():チェーンテーブルを小さい順に並べ替える
  • .
  • indexOf(int begin,int end,T key):インデックスbeginとendの間で値keyを検索し、論理番号
  • を返します.
  • search(T key):機能はindexOfと同じで、チェーンテーブル全体を遍歴し、一般的には使用されず、主に辞書
  • を実現するために使用される.
  • contains(T key):チェーンテーブルに値がkeyノード
  • が存在するか否かを判断する.
  • toString():チェーンテーブルの値を文字列
  • に変換します.
  • toArray():チェーンテーブルをObject配列
  • に変換する
  • toArray(E[]a):単一チェーンテーブルを特定のタイプの配列に変換し、関数汎用
  • を使用します.
  • iterator():反復オブジェクト
  • を返します.
    Java->チェーンテーブルコード
    1、コードを使うときはpackageを自分のファイルがあるパッケージ名に変更することを忘れないでください.2、コードのLinkListで継承された親AbsListはここでは書かれていません.コードを書くとき、シーケンステーブルSeqListでAbsListクラスを実現しました.このAbsListはデフォルトでdefault、つまりパケットアクセス権(default修飾のクラスはパケットアクセス)です.それから、SeqListとLinkListの2つのクラスを1つのパケットに入れました.だから実はLinkListが使用しているAbsListは実はSeqListクラスのAbsListなので、ここでは前編のSeqListのAbsListを使用していますので、このクラスを使用できるようにするには、上記の記事のAbsListクラスcopyを探してみてください.あるいは---->転送ドアをクリックしても届きます
    /*
     * created on April 16 14:40 2019
     * 
     * @author:lhy
     */
    package DS;
    
    import java.util.Iterator;
    
    
    //     Lnode
    class Lnode<T> implements Comparable<Lnode<T>> {
    	public T data;	//    
    	public Lnode<T> next;	//       
    
    	// Lnode    
    	public Lnode(T key) {
    		data = key;
    		next = null;
    	}
    
    	public Lnode(T key, Lnode<T> next) {
    		data = key;
    		this.next = next;
    	}
    
    	//          
    	public boolean equals(Object e) {
    		Lnode<T> node = (Lnode<T>) e;
    		return data.equals(node.data);
    	}
    
    	//   Comparable compareTo  ,            
    	public int compareTo(Lnode<T> e) {
    		Comparable<T> x;
    		if(data instanceof Comparable) {
    			x=(Comparable<T>)data;
    			return (int)x.compareTo(e.data);
    		}
    		else {
    			throw new ClassCastException("      ");
    		}
    	}
    	
    	//             
    	public String toString() {
    		return data.toString();
    	}
    }
    
    /*
     * LinkList API  
     * 
     * LinkList():     
     * clear():       
     * removeAll():       ,  clear     
     * getNode(int i):      i   
     * get(int i):      i     
     * set(int i,T x):   i     
     * add(int i,T x):    x      i   
     * add(T key):          key
     * addBack(T key):          key, add(T key)       
     * addFront(T key):          key
     * remove(int i):   i   ,   i       
     * remove():   remove,     
     * removeFront():        , remove()    
     * removeBack():        
     * addSort(T value):   value              
     * sort():                 
     * indexOf(int begin,int end,T key):    begin end     key,      
     * search(T key):    indexOf,      ,     ,        
     * contains(T key):            key  
     * toString():             
     * toArray():       Object  
     * toArray(E[] a):               ,       
     * iterator():        
     */
    public class LinkList<T> extends AbsList<T> implements Iterable<T> {
    	//LinkList   SeqList  AbsList   ,   Iterable  
    	Lnode<T> first=null,last=null; //       
    	Iterator<T> iterator=null; //          
    	//    
    	public LinkList() {
    		first=last=null;
    		length=0;
    		this.iterator=new LinkIterator();
    	}
    	
    	//   ,     
    	private int compare(Lnode<T> a,Lnode<T> b) {
    		return a.compareTo(b);
    	}
    	//      
    	public void clear() {
    		first=last=null;
    		length=0;
    	}
    	
    	//      ,  clear     
    	public void removeAll() {
    		clear();
    	}
    	
    	//      i   
    	public Lnode<T> getNode(int i){
    		//  i       
    		if(i<0||i>length-1) {
    			return null;
    		}
    		//  i       (        )
    		if(i==0) {
    			return first;
    		}
    		else {
    			Lnode<T> p=first;
    			int j=0;
    			while (p!=null&&j<i) {
    				p=p.next;
    				j++;
    			}
    			return p;
    		}
    		
    	}
    	
    	//  i     ,  getNode      
    	public T get(int i) {
    		Lnode<T> pLnode=getNode(i);
    		if(pLnode==null)
    			return null;
    		else 
    			return pLnode.data;
    	}
    	
    	//  i     
    	public boolean set(int i,T x) {
    		Lnode<T> p=getNode(i);
    		if(p==null) {
    			return false;
    		}
    		else {
    			p.data=x;
    			return true;
    		}
    	}
    	
    	//   x      i   
    	public void add(int i,T x) {
    		Lnode<T> p,s;
    		int j=i-1;
    		s=new Lnode<T>(x,null);
    		//         s
    		if(first==null||length==0) {
    			first=s;
    			last=s;
    		}
    		
    		//          s, i=0 
    		else if(j<0) {
    			s.next=first;
    			first=s;
    		}
    		//         s
    		else if(j>=length-1) {
    			last.next=s;
    			last=s;
    		}
    		//         s
    		else {
    			p=getNode(j);
    			s.next=p.next;
    			p.next=s;
    		}
    		length++;
    	}
    	
    	//  add()  ,         key
    	public void add(T key) {
    		add(length,key);
    	}
    	
    	//         key, add(T key)       
    	public void addBack(T key) {
    		add(length,key);
    	}
    	
    	//         key
    	public void addFront(T key) {
    		add(0,key);
    	}
    	
    	//  i   ,   i       ,    removeNode  
    	public T remove(int i) {
    		Lnode<T> p=removeNode(i);
    		if(p!=null)
    			return p.data;
    		else
    			return null;
    	}
    	
    	//    ,      i   ,    ,  Lnode
    	protected Lnode<T> removeNode(int i){
    		Lnode<T> p,q;
    		//        
    		if(first==null) {
    			return null;
    		}
    		//     
    		if(i==0) {
    			p=first;
    			first=first.next;
    			length-=1;
    			return p;
    		}
    		//          
    		if(i>=1 && i<=length-1) {
    			//    i-1       
    			p=getNode(i-1);
    			//  i        
    			q=p.next;
    			p.next=q.next;
    			if(q==last) {
    				last=p;
    			}
    			length--;
    			return q;
    		}
    		return null;
    	}
    	
    	//  remove,     
    	public T remove() {
    		return removeNode(0).data;
    	}
    	
    	//     , remove()    
    	public T removeFront() {
    		return removeNode(0).data;
    	}
    	
    	//     
    	public T removeBack() {
    		return removeNode(length-1).data;
    	}
    	
    	//  value              ,  insertOrder  
    	public void addSort(T value) {
    		Lnode<T> s=new Lnode(value);
    		insertOrder(s);
    	}
    	
    	//         
    	private void insertOrder(Lnode<T> s) {
    		Lnode<T> p1,p2;
    		length++;
    		//         
    		if(first==null) {
    			first=s;
    			last=first;
    			return ;
    		}
    		//       ,           
    		if(compare(s, first)<0) {
    			s.next=first;
    			first=s;
    			return ;
    		}
    		//         ,          
    		if(compare(s, last)>0) {
    			last.next=s;
    			last=s;
    			return ;
    		}
    		//      p p1 p2  ,p1  ,p2  
    		p2=first;
    		p1=p2;
    		while(p2!=null) {
    			//s   p2    , p1  p2,p2      ,  s    p2     ,  s     p1 p2  
    			if(compare(s, p2)>0) {
    				p1=p2;
    				p2=p2.next;
    			}
    			else {
    				break;
    			}
    		}
    		s.next=p2;
    		p1.next=s;
    		return;
    	}
    	
    	//     
    	public void sort() {
    		LinkList<T> sl=new LinkList<T>();//             
    		Lnode<T> p;
    		p=this.removeNode(0);//          
    		while(p!=null) {
    			sl.addSort(p.data);
    			p=this.removeNode(0);
    		}
    		Lnode<T> q=sl.first;
    		while(q!=null) {
    			this.add(q.data);
    			q=q.next;
    		}
    	}
    	
    	//   begin end     key,      
    	public int indexOf(int begin,int end,T key) {
    		Lnode<T> p=getNode(begin);//      
    		int i=begin;
    		while(p!=null&&i<end) {
    			if(p.data.equals(key))
    				return i;
    			p=p.next;
    			i++;
    		}
    		return -1;
    	}
    	
    	//   indexOf,     ,        
    	public T search(T key) {
    		Lnode<T> p=getNode(0);
    		while(p!=null) {
    			if(p.data.equals(key)) {
    				return p.data;
    			}
    			p=p.next;
    		}
    		return null;
    	}
    	
    	//           key  
    	public boolean contains(T key) {
    		if(indexOf(0,length,key)==-1) return false;
    		else return true;
    	}
    	
    	//            
    	public String toString() {
    		String string;
    		Lnode<T> pLnode;
    		pLnode=first;
    		string="(";
    		while(pLnode!=null) {
    			string+=pLnode.data.toString()+" ";
    			pLnode=pLnode.next;
    		}
    		return string+")";
    	}
    	
    	//      Object  
    	public Object[] toArray() {
    		Object[] a=new Object[length];
    		Lnode<T> pLnode=first;
    		for(int i=0;i<length;i++) {
    			a[i]=pLnode.data;
    			pLnode=pLnode.next;
    		}
    		return a;
    	}
    	
    	//              ,       
    	public <E> E[] toArray(E[] a) {
    		if(a.length<length) {
    			//       length(       ),     a        ,      E[]  
    			a=(E[])java.lang.reflect.Array.newInstance(a.getClass().getComponentType(), length);
    		}
    		int i=0;
    		Object[] result=a;
    		Lnode<T> xLnode=this.first;
    		for(i=0;i<length;i++) {
    			result[i]=xLnode.data;
    			xLnode=xLnode.next;
    		}
    		if(a.length>length) {
    			a[length]=null;
    		}
    		return a;
    	}
    	
    	//       
    	public Iterator<T> iterator(){
    		return new LinkIterator();
    	}
    	
    	//   ,     
    	private class LinkIterator implements Iterator<T>{
    		private int index=0;
    		private Lnode<T> current=first;
    		public boolean hasNext() {
    			//   next()  ,index  ,  index   person   
    			return (index!=length() && current!=null);
    		}
    		
    		public T next() {
    			T temp=current.data;
    			current=current.next;
    			index++;
    			return temp;
    		}
    		
    		public int nextIndex() {
    			return index++;//   index  ,  1
    		}
    		public void remove() {
    			//      
    		}
    	}
    }
    
    

    チェーンテーブルの使用例
    LinkListチェーンテーブルオブジェクトを作成し、LinkListクラスの各関数を検証します.コードは以下の通りです.
    /*
     * created on April 16 15:40 2019
     * 
     * @author:lhy
     */
    package DS;
    
    import java.util.Iterator;
    
    /*
     * LinkList API  
     * 
     * LinkList():     
     * clear():       
     * removeAll():       ,  clear     
     * get(int i):      i     
     * set(int i,T x):   i     
     * add(int i,T x):    x      i   
     * add(T key):          key
     * addBack(T key):          key, add(T key)       
     * addFront(T key):          key
     * remove(int i):   i   ,   i       
     * remove():   remove,     
     * removeFront():        , remove()    
     * removeBack():        
     * addSort(T value):   value              
     * sort():                 
     * indexOf(int begin,int end,T key):    begin end     key,      
     * search(T key):    indexOf,      ,     ,        
     * contains(T key):            key  
     * toString():             
     * toArray():       Object  
     * toArray(E[] a):               ,       
     * iterator():        
     */
    
    public class Test_LinkList {
    	public static void main(String[] args) {
    		LinkList<Integer> linkList=new LinkList<Integer>();
    		// linkList  
    		for(int i=0;i<10;i++) {
    			linkList.add((int)(Math.random()*1000));
    		}
    		System.out.println("            :"+linkList.toString());
    		System.out.println("  7         :"+linkList.get(7));
    		//    1       2333
    		linkList.set(1,2333);
    		System.out.println(" 1       2333,    :"+linkList.toString());
    		// 3       5555   
    		linkList.add(3,5555);
    		System.out.println(" 3         5555   ,    :"+linkList.toString());
    		//         9999   
    		linkList.add(9999);
    		System.out.println("         9999   ,    :"+linkList.toString());
    		//         12345   
    		linkList.addFront(12345);
    		System.out.println("         12345   ,    :"+linkList.toString());
    		System.out.println("  4   ,    :"+linkList.remove(4));
    		System.out.println("  4    ,    "+linkList.toString());
    		//     
    		linkList.removeBack();
    		System.out.println("      ,    :"+linkList.toString());
    		// linkList    
    		linkList.sort();
    		System.out.println("       :"+linkList.toString());
    		//            666   
    		linkList.addSort(666);
    		System.out.println("            666    ,    :"+linkList.toString());
    		System.out.println("    666          :"+linkList.indexOf(0, linkList.length,666));
    		System.out.println("          665   :"+linkList.contains(665));
    		//           
    		Iterator<Integer> iterator=linkList.iterator();
    		//           
    		System.out.print("           :");
    		while(iterator.hasNext()) {
    			System.out.print(iterator.next()+" ");
    		}
    		//    
    		linkList.clear();
    		System.out.println("
    :"
    +linkList.toString()); } }

    出力:
    (834 738 152 568 863 608 495 975 742 475 )
      7975
     1       2333,    :(834 2333 152 568 863 608 495 975 742 475 )
     3         5555   ,(834 2333 152 5555 568 863 608 495 975 742 475 )
             9999   ,(834 2333 152 5555 568 863 608 495 975 742 475 9999 )
             12345   ,    :(12345 834 2333 152 5555 568 863 608 495 975 742 475 9999 )
      4   ,    :5555
      4(12345 834 2333 152 568 863 608 495 975 742 475 9999 )
          ,    :(12345 834 2333 152 568 863 608 495 975 742 475 )(152 475 495 568 608 742 834 863 975 2333 12345 )
                666    ,    :(152 475 495 568 608 666 742 834 863 975 2333 12345 )
        6665
              665false152 475 495 568 608 666 742 834 863 975 2333 12345()