注文リンクリスト:
キー値でソートします。チェーンヘッダーを削除すると、最小値(/最大)値が削除されます。挿入するときは、挿入位置を検索します。
挿入する場合、O(n)、平均O(n/2)を比較する必要があり、チェーンヘッドで最小(/最大)データを削除する場合、効率はO(1)です。
アプリケーションが最小(/最大)データ項目への頻繁なアクセス(挿入/検索/削除)が必要な場合、注文されたリンクリストが適切な選択です。優先キューは、順序付けられたリンクリストを使用して、順序付けられたリンクリストの挿入並べ替えを実装できます。
順序付けられていない配列の場合、順序付けられたリンクリストで並べ替え、比較の時間レベルはo(n^2)です
コピー時間レベルはO(2*n)です。コピーの数が少ないため、リンクリストのデータは初めてn回移動され、リンクされたリストから配列にコピーされます。 n回、新しいリンクが挿入されるたびに、移動データをコピーする必要はなく、リンクドメインを変更するために1つまたは2つのリンクのみが必要です。
java.util.arraysをインポートします。 java.util.randomをインポートします。 / ***順序付けられたリンクリストに挿入配列を挿入* @Author Stone*/ public class linkedlistinSertsort <t拡張<t >> {private link <t> first; // first node public linkedlistinSertsort(){} public boolean isempty(){return first == null; } public void sortlist(t [] ary){if(ary == null){return; } //リンクされたリストに配列要素を挿入し、(t data:ary){insert(data)の順序付けられたリンクリストに並べ替えます。 } //} public void insert(t data){//チェーンヘッダーに挿入し、小さなリンクから大規模なリンク<t> newlink = new link <t>(data); link <t> current = first、forter = null; while(current!= null && data.compareto(current.data)> 0){previous = current; current = current.next; } if(forter == null){first = newLink; } else {forter.next = newLink; } newlink.next = current; } public link <t> deleteFirst(){//チェーンヘッダーリンク<t> temp = first;を削除します。 first = first.next; //最初のノードを変更して温度を返します。 } public link <t> find(t t){link <t> find = first; while(find!= null){if(!find.data.equals(t)){find = find.next; } else {break; }} return find; } public link <t> delete(t t){if(isempty()){return null; } else {if(first.data.equals(t)){link <t> temp = first; first = first.next; //最初のノードを次のノードに戻すTEMPに変更します。 }} link <t> p = first; link <t> q = first; while(!p.data.equals(t)){if(p.next == null){//チェーンの最後にnullが見つかっていないことを示します。 } else {q = p; p = p.next; }} q.next = p.next; pを返します。 } public void displaylist(){// Travel System.out.println( "list(first-> last):"); link <t> current = first; while(current!= null){current.displaylink(); current = current.next; }} public void displaylistreverse(){//逆トラバーサルリンク<t> p = first、q = first.next、t; (q!= null){//ポインターが逆になっている場合、トラバースされたデータ順序は後方t = q.nextです。 // no3 if(p == first){//元のヘッダーである場合、ヘッダーの.nextは空のp.next = nullである必要があります。 } q.next = p; // no3-> no1 pointer Reverse p = q; // startは逆ですq = t; // no3 start} //上記のループの場合、first.nextは空で、qがnullでループを実行しない場合、pは元のほとんどのデータ項目です。反転後、Pはfirst first = pに割り当てられます。 displaylist(); } class link <t> {// link point t data; //データフィールドリンク<t> next; //後続のポインター、ノードチェーンドメインリンク(tデータ){this.data = data; } void displaylink(){system.out.println( "データは" + data.toString()); }} public static void main(string [] args){linkedlistinsertsort <integer> list = new linkedlistinsertsort <integer>(); RANDOM RANDOM = new Random(); int len = 5; integer [] ary = new Integer [len]; for(int i = 0; i <len; i ++){ary [i] = random.nextint(1000); } system.out.println( "------------"); system.out.println(arrays.tostring(ary)); system.out.println( "----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- List.DisPlayList();}}
印刷
---ソートの前に---- [595、725、310、702、444] ---リンクリストの並べ替え後----リスト(最初 - > last):データは310です。データは444です。データは702です。
単一のリンクリストの反転:
public class singlelinkedlistreverse {public static void main(string [] args){node head = new node(0);ノードtemp = null;ノードcur = null; for(int i = 1; i <= 10; i ++){temp = new node(i); if(i == 1){head.setnext(temp); } else {cur.setnext(temp); } cur = temp; } // 10.next = null;ノードh = head; while(h!= null){system.out.print(h.getdata() + "/t"); h = h.getnext(); } system.out.println(); //逆転1 // h = node.reverse1(head); //(h!= null){// System.out.print(h.getData() + "/t"); // h = h.getNext(); //} // 2 h = node.reverse1(head); while(h!= null){system.out.print(h.getdata() + "/t"); h = h.getnext(); }}}/**単一のリンクリストの各ノードには、次のノードを指す属性*/class node {object data; // data object node next; //次のノードノード(オブジェクトD){this.data = d; } node(object d、node n){this.data = d; this.next = n; } public Object getData(){return data; } public void setData(オブジェクトデータ){this.data = data; } public node getNext(){return next; } public void setNext(node next){this.next = next; } //方法1ヘッドは静的ノードreverse1(ノードヘッド){node p = null; //反転ノードq = head後の新しいヘッド。 //回転結果:012,123,234、...... 10 null null while(head.next!= null){p = head.next; //最初のものは2番目のものに置き換えられ、Pは次のhead.next = p.next; // 2番目のものは3番目のものに置き換えられ、すでに最初の位置に到達した次のものは最初の位置になり、最初の位置が最初の位置になります。 //新しいものは最初のものに置き換えられます} return p; } //方法2ヘッドは静的ノードリバース2(ノードヘッド)をリセットしません{//中間ノードのポインターを前のノードに向けて、リンクリストの後方ノードP1 = head、p2 = head.next、p3を引き続きトラバースし続けることができます。 //フロント、ミドル、バック/回転結果:012、123、234、345、456 .... 9 10 null while(p2!= null){p3 = p2.next; p2.next = p1; //後方に向けてポイントし、P1 = P2をポイントします。 // 2、3はP2 = P3を前方に移動します。 } head.next = null; //ヘッドは変更されていません。出力が0に達したら、0を要求します。 }}