検索
ホームページJava&#&チュートリアルJava二重リンクリストで追加、削除、変更、クエリを実装する方法

1. 二重リンク リストについて理解する

一方向リンク リストは、現在のノード値を保存するだけでなく、次のノードのアドレスも保存します

Java二重リンクリストで追加、削除、変更、クエリを実装する方法

## 二重リンク リストは、現在のノードの値を保存するだけでなく、前のノードのアドレスと次のノードのアドレスも保存します

Java二重リンクリストで追加、削除、変更、クエリを実装する方法

二重リンクリストの構造を定義します。 ポイントクラス:

ノードは、現在のノードの値だけでなく、このノードの先行ノードのアドレスとノードのアドレスも保存する必要があります。このノードの後続ノード

class DoubleNode{
    public DoubleNode next;
    DoubleNode prev;
    int val;
    DoubleNode tail;

    public DoubleNode() {}

    public DoubleNode(int val) {
        this.val = val;
    }

    public DoubleNode(DoubleNode prev, int val, DoubleNode tail) {
        this.prev = prev;
        this.val = val;
        this.tail = tail;
    }
}

二重リンク リスト クラスを定義します:

前から後ろ、または後ろから前に指定できるため、このクラスでは、先頭ノードと末尾ノードの値が保存されます

public class DoubleLinkedList {
    private int size;
    private DoubleNode head;
    private DoubleNode tail;
}

2. 二重リンクリストの追加、削除、変更、確認を行います

1.

先頭プラグを挿入します
現在のリンク リストの先頭ノードにノードを挿入して、現在のリンク リストの先頭ノードの先行ノードが挿入するノード ノードを指すようにし、ノードの後続ノードが次を指すようにします。 head を指定し、head = ノードにすると、そのノードがリンク リストのヘッド ノードになります

Java二重リンクリストで追加、削除、変更、クエリを実装する方法

#コードは次のとおりです。

/**
     * 头插
     */
    public void addFirst(int val){
        DoubleNode node = new DoubleNode(val);
        if (head == null){
            head = tail = node;
        }else{
            node.next = head;
            head.prev = node;
            head = node;
        }
        size++;
    }
末尾の挿入

# は、

## がリンク リストの最後に挿入されることを除いて、先頭の挿入と同じです

##コードは次のとおりです: Java二重リンクリストで追加、削除、変更、クエリを実装する方法

 public void addLast(int val){
        DoubleNode node = new DoubleNode(val);
        if (head == null){
            head = tail =node;
        }else{
            tail.next = node;
            node.prev = tail;
            tail = node;
        }
        size++;
    }

インデックス位置に挿入

値 val を持つノードをインデックス位置に挿入します:

Insertionそれでも先行ノードを見つける必要がありますが、二重リンク リストで先行ノードを見つけることは、一方向リンク リストで先行ノードを見つけるよりもはるかに柔軟です。一方向リンク リストは最初から最後までしか進むことができません。このときのノード数は 100 なので、インデックスは 98 です。その位置にノードを挿入すると、末尾ノードから二重リンクリストを検索できるようになり、さらに便利になります。前から後ろに検索するか、後ろから前に検索するかを判断しますか?

1.index 挿入位置は前から後ろから見ると前半になります

2 .index > size / 2 – > 後ろから前に見て、挿入位置は後半です

  • # #コードは次のとおりです:

    /**
         * 在index位置插入
         * @param index
         * @param val
         */
        public void add(int index,int val){
            DoubleNode cur = new DoubleNode(val);
            if (index < 0 || index > size){
                System.err.println("add index illegal");
                return;
            }else{
                if (index == 0){addFirst(val);}
                else if (index == size){addLast(val);}
                else{
                    DoubleNode prev = node(index-1);
                    DoubleNode next = prev.next;
                    cur.next = next;
                    next.prev = cur;
                    prev.next = cur;
                    cur.prev = prev;
                }
            }
            size++;
        }
    /**
         * 根据索引值找到对应的结点
         * @param index
         * @return
         */
        private DoubleNode node(int index){
            DoubleNode x = null;
            if (index < size/2){
                x = head;
                for (int i = 0; i < index; i++) {
                    x = x.next;
                }
            }else{
                x = tail;
                for (int i = size - 1; i > index ; i--) {
                    x = x.prev;
                }
            }
            return x;
        }
  • 2.

Java二重リンクリストで追加、削除、変更、クエリを実装する方法 コードを次のように変更します:

/**
     * 修改双向链表index位置的结点值为newVal
     */
    public int set(int index,int newVal){
        DoubleNode dummyHead = new DoubleNode();
        dummyHead.next = head;
        DoubleNode prev = dummyHead;
        DoubleNode cur = prev.next;
        if (index < 0 || index > size - 1){
            System.err.println("set index illegal");
        }else{
            for (int i = 0; i < index; i++) {
                prev = prev.next;
                cur = cur.next;
            }
        }
        int oldVal = cur.val;
        cur.val = newVal;
        return oldVal;
    }
3. ## をクエリします。

# コードは次のとおりです:

 /**
     * 查询index位置的结点值
     */
    public int get(int index){
        DoubleNode dummyHead = new DoubleNode();
        dummyHead.next = head;
        DoubleNode prev = dummyHead;
        DoubleNode cur = prev.next;
        if (index < 0 || index > size - 1){
            System.err.println("get index illegal");
        }else{
            for (int i = 0; i < index; i++) {
                prev = prev.next;
                cur = cur.next;
            }
        }
        return cur.val;
    }

4. 削除インデックス位置のノードを削除します

コードは次のとおりです:

//删除链表index位置的结点
    public void removeIndex(int index){
        if (index < 0 || index > size - 1){
            System.err.println("remove index illegal");
            return;
        }
        DoubleNode cur = node(index);
        unlink(cur);
    }
 /**
     * 删除当前双向链表的node结点
     * 分治法
     * @param node
     */
    private void unlink (DoubleNode node){
        DoubleNode prev = node.prev;
        DoubleNode successor = node.next;
        //1.先处理node的前半部分
        if (prev == null){
            head = successor;
        }else{
            //前驱不为空的情况
            prev.next = successor;
            node.prev = null;
        }
        if (successor == null){
            tail = prev;
        }else{
            successor.prev = prev;
            node.next = null;
        }
        size--;
    }
Head delete

を呼び出すだけで任意の位置のノードを削除できます

コードは次のとおりです:

//头删
    public void removeFirst(){
      removeIndex(0);
    }
Tail delete

を呼び出すだけで、任意の位置にあるノードを削除できます。

コードは次のとおりです。

//尾删
    public void removeLast(){
        removeIndex(size - 1);
    }
最初のノードを削除します。 value val

コードは次のとおりです:

//删除第一个值为val的结点
    public void removeValOnce(int val){
        if (head == null){
            return;
        }
        for (DoubleNode x = head;x != null;x = x.next){
            if (x.val == val){
                unlink(x);
                break;
            }
        }
    }

 /**
     * 删除当前双向链表的node结点
     * 分治法
     * @param node
     */
    private void unlink (DoubleNode node){
        DoubleNode prev = node.prev;
        DoubleNode successor = node.next;
        //1.先处理node的前半部分
        if (prev == null){
            head = successor;
        }else{
            //前驱不为空的情况
            prev.next = successor;
            node.prev = null;
        }
        if (successor == null){
            tail = prev;
        }else{
            successor.prev = prev;
            node.next = null;
        }
        size--;
    }

値が val

であるすべての値を削除しますコードは次のとおりです:
rree

以上がJava二重リンクリストで追加、削除、変更、クエリを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事は亿速云で複製されています。侵害がある場合は、admin@php.cn までご連絡ください。
JVMは、さまざまなプラットフォームでガベージコレクションをどのように管理していますか?JVMは、さまざまなプラットフォームでガベージコレクションをどのように管理していますか?Apr 28, 2025 am 12:23 AM

jvmmanagesgarbagecollectionacrossplatformseftivivivivitybyusagenerationalaphadadadaptingtosandhardwaredefferences.itemployscollectorslikeserial、parallel、cms、andg1、各sutitedfordifferentscenarios

なぜJavaコードは変更せずに異なるオペレーティングシステムで実行できるのですか?なぜJavaコードは変更せずに異なるオペレーティングシステムで実行できるのですか?Apr 28, 2025 am 12:14 AM

Javaは、Javaの「Write and Averywherewhere」という哲学がJava Virtual Machine(JVM)によって実装されているため、変更なしで異なるオペレーティングシステムで実行できます。コンパイルされたJavaバイトコードとオペレーティングシステムの間の仲介者として、JVMはバイトコードを特定のマシン命令に変換し、JVMがインストールされた任意のプラットフォームでプログラムが独立して実行できることを確認します。

Javaプログラムをコンパイルして実行するプロセスを説明し、プラットフォームの独立性を強調します。Javaプログラムをコンパイルして実行するプロセスを説明し、プラットフォームの独立性を強調します。Apr 28, 2025 am 12:08 AM

Javaプログラムの編集と実行は、BytecodeとJVMを通じ​​てプラットフォームの独立性を達成します。 1)Javaソースコードを書き、それをbytecodeにコンパイルします。 2)JVMを使用して、任意のプラットフォームでByteCodeを実行して、コードがプラットフォーム間で実行されるようにします。

基礎となるハードウェアアーキテクチャは、Javaのパフォーマンスにどのように影響しますか?基礎となるハードウェアアーキテクチャは、Javaのパフォーマンスにどのように影響しますか?Apr 28, 2025 am 12:05 AM

Javaのパフォーマンスはハードウェアアーキテクチャと密接に関連しており、この関係を理解することでプログラミング機能を大幅に改善できます。 1)JVMは、CPUアーキテクチャの影響を受けるJITコンピレーションを介して、Java Bytecodeを機械命令に変換します。 2)メモリ管理とゴミ収集は、RAMとメモリバスの速度の影響を受けます。 3)キャッシュとブランチ予測Javaコードの実行を最適化します。 4)マルチスレッドと並列処理がマルチコアシステムのパフォーマンスを改善します。

ネイティブライブラリがJavaのプラットフォームの独立性を破ることができる理由を説明してください。ネイティブライブラリがJavaのプラットフォームの独立性を破ることができる理由を説明してください。Apr 28, 2025 am 12:02 AM

ネイティブライブラリを使用すると、これらのライブラリはオペレーティングシステムごとに個別にコンパイルする必要があるため、Javaのプラットフォームの独立性が破壊されます。 1)ネイティブライブラリはJNIを介してJavaと対話し、Javaが直接実装できない機能を提供します。 2)ネイティブライブラリを使用すると、プロジェクトの複雑さが増し、さまざまなプラットフォームのライブラリファイルの管理が必要です。 3)ネイティブライブラリはパフォーマンスを改善できますが、それらは注意して使用し、クロスプラットフォームテストを実施する必要があります。

JVMはオペレーティングシステムAPIの違いをどのように処理しますか?JVMはオペレーティングシステムAPIの違いをどのように処理しますか?Apr 27, 2025 am 12:18 AM

JVMは、JavanativeInterface(JNI)およびJava Standard Libraryを介してオペレーティングシステムのAPIの違いを処理します。1。JNIでは、Javaコードがローカルコードを呼び出し、オペレーティングシステムAPIと直接対話できます。 2. Java Standard Libraryは統一されたAPIを提供します。これは、異なるオペレーティングシステムAPIに内部的にマッピングされ、コードがプラットフォーム間で実行されるようにします。

Java 9で導入されたモジュール性は、プラットフォームの独立性にどのように影響しますか?Java 9で導入されたモジュール性は、プラットフォームの独立性にどのように影響しますか?Apr 27, 2025 am 12:15 AM

modularitydoesnotdirectlyectlyectjava'splatformindepensence.java'splatformendepenceismaindainededainededainededaindainedaindained bythejvm、butmodularityinfluencesApplucationStructure andmanagement、間接的なインパクチャプラット形成依存性.1)

ByteCodeとは何ですか?また、Javaのプラットフォームの独立性とどのように関係していますか?ByteCodeとは何ですか?また、Javaのプラットフォームの独立性とどのように関係していますか?Apr 27, 2025 am 12:06 AM

bytecodeinjavaisthe intermediaterepresentationthateNablesplatformindepence.1)javacodeis compiledintobytecodestoredin.classfiles.2)thejvminterpretsorcompilesthisbytecodeintomachinecodeatime、

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

SublimeText3 英語版

SublimeText3 英語版

推奨: Win バージョン、コードプロンプトをサポート!

MantisBT

MantisBT

Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

DVWA

DVWA

Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。