【データ構造とアルゴリズム】シングルリンクリスト(SingleLinkedList)



リンクリスト

1.リンクリストのメモリストレージ構造の概要

ここに画像の説明を挿入

  • リンクリストは、チェーンストレージであるノードの形式で保存されます

  • 各ノードにはdata 域当前节点的值next 域が含まれます指向下一个节点

  • リンクリストのノードは必ずしも継続的に保存されるとは限りません---- 靠next域进行节点间的连接指向,最后链表的以NULL值结束
    ここに画像の説明を挿入

  • リンクリストは、ヘッドノードのあるリンクリストとヘッドノードのないリンクリストに分けられ、実際のニーズに応じて決定されます。

トップに戻る


2.リンクリストの論理構造の概要

ここに画像の説明を挿入

  • いわゆる論理構造は、実際には、リンクリスト内のノードを最後まで順番に接続することによって形成されるチェーン構造です。

トップに戻る


3.単一リンクリストの適用例は、ヘッド付きの単一リンクリストを使用して実現されます-ウォーターマージンヒーローズランキング管理

♑ヒーローを追加するときは、リンクリストの最後に直接追加してください

ここに画像の説明を挿入

単一のリンクリスト

  • 主な构建含有头节点的单链表特長:实现链表节点的添加、、链表的输出
  • ノードクラスを使用してヘッドノードを作成する-修正済み
  • リンクリスト要素のメソッドの追加:リンクリストの最後にノードを直接追加します。リンクリストの最後にノードを直接追加するには、最初にリンクリストの構造であるリンクリストに戻る必要があります最后节点的特点 ---- next域为null。この点を把握するには、ノードを追加するときにリンクリストをトラバースし、最後のノードを見つけます(temp.next = null現在のリンクリストの、次に、ノードによって最後のノードに割り当てられた新しい次のフィールドを追加します(temp.next = heroNode
  • 導入するプロセス全体辅助节点tempで、ヘッドノードの属性を割り当て、それを順番に比較するヘッドノードを表すことに注意してください。ある意味で、tempはポインタと見なすことができます。補助ノードを導入するための鍵はヘッドノードが許可されていないこと。
  • 同様に、リンクリストを出力する場合、補助ノードはトラバーサル出力にも使用されます。
class singleLinkedList{
    
    
    // 创建头节点,固定不动
    private HeroNode head = new HeroNode(0,"","");
    // 添加节点
    public void add(HeroNode heroNode){
    
    
        // 借助辅助节点进行遍历
        HeroNode temp = head;
        // 循环遍历,直到找不到下一个(以达到当前链表的最后一个节点)
        while (true){
    
    
            if (temp.next == null){
    
    
                break;
            }
            // 不是最后一个,后移一个节点
            temp = temp.next;
        }
        // 当退出循环的时候,temp指向了链表的最后
        // 将最后节点的next指向新的节点
        temp.next = heroNode;
    }
    // 显示链表
    public void showList(){
    
    
        // 既然显示链表,那就得遍历,首先判断链表是否为空
        // 如果头节点的下一个为空,那么该链表为空
        if (head.next == null){
    
    
            System.out.println("该链表为空!");
            return;
        }
        // 同样借助辅助节点
        HeroNode temp = head.next;
        // 循环遍历
        while (true){
    
    
            // 如果temp为空,表示到了链表的最后
            if (temp == null){
    
    
                break;
            }
            // 输出信息
            System.out.println(temp);
            // 节点后移
            temp = temp.next;
        }
    }
}

ノードクラス

  • 主な機能:创建节点
  • ノードの構造とノードに含まれる情報を宣言します
// 创建节点,每个节点就是一个对象
class HeroNode{
    
    
    public int no;          // 编号
    public String name;
    public String nickName;
    public HeroNode next;   // 下一个节点

    public HeroNode(int no, String name, String nickName) {
    
    
        this.no = no;
        this.name = name;
        this.nickName = nickName;
    }

    @Override
    public String toString() {
    
    
        return "HeroNode{" +
                "no=" + no +
                ", name='" + name + '\'' +
                ", nickName='" + nickName + '\'' +
                '}';
    }
}

テスト

package 链表;

public class singleLinkedLsitDemo {
    
    
    public static void main(String[] args) {
    
    
        // 创建一个单链表
        singleLinkedList singleLinkedList = new singleLinkedList();
        // 创建多个节点
        HeroNode hero1 = new HeroNode(1,"宋江","及时雨");
        HeroNode hero2 = new HeroNode(2,"卢俊义","玉麒麟");
        HeroNode hero3 = new HeroNode(3,"吴用","智多星");
        HeroNode hero4 = new HeroNode(4,"林冲","豹子头");
        HeroNode hero5 = new HeroNode(5,"李逵","黑旋风");
        // 向链表中添加节点
        singleLinkedList.add(hero1);
        singleLinkedList.add(hero2);
        singleLinkedList.add(hero3);
        singleLinkedList.add(hero4);
        singleLinkedList.add(hero5);
        // 输出链表
        singleLinkedList.showList();
    }
}

ここに画像の説明を挿入

トップに戻る


♑ヒーローを追加するときは、ランキングに従って指定した位置にヒーローを挿入します

ここに画像の説明を挿入
ランキングに応じた加算方法を実現

  • 主な機能:找到排名位置进行节点插入
  • ここに2つの主な要件があります:1.对链表的添加元素实行有序添加;2.对于已存在编号的元素舍弃添加
  • リンクリストの最後に直接追加されたadd()メソッドに基づいて、新しいノードが追加された場所を見つけるのが困難です。いわゆる順序はノード(no)の番号情報に基づいており、番号を比較し、トラバーサルには引き続き補助ノ​​ードを使用します。
  • サイズ比較のためのトラバース辅助节点.next新节点数(図のバインディングを参照)の場合、位置を取得した後、次のフィールドがシリーズリストに表示されます。
// 进行排名添加
public void addByOrder(HeroNode heroNode) {
    
    
    // 通过编号顺序添加到列表中,若已存在编号,则不能添加
    HeroNode temp = head;
    boolean flag = false; // 标志是否已存在某一编号的节点
    while (true) {
    
    
        // 链表为空
        if (temp.next == null) {
    
    
            break;
        }
        // 在插入的时候,是位于添加位置的前一个节点
        if (temp.next.no > heroNode.no) {
    
    
            break; // 添加位置找到
        } else if (temp.next.no == heroNode.no) {
    
    
            flag = true; // 编号已存在
            break;
        }
        // 节点后移
        temp = temp.next;
    }
    // 判断状态
    if (flag) {
    
    
        System.out.printf("该英雄的编号 %d 已经存在\n", heroNode.no);
    } else {
    
    
        // 将新的节点加入到链表中
        heroNode.next = temp.next;
        temp.next = heroNode;
    }
}

テスト

public class singleLinkedLsitDemo {
    
    
    public static void main(String[] args) {
    
    
        // 创建一个单链表
        singleLinkedList singleLinkedList = new singleLinkedList();
        // 创建多个节点
        HeroNode hero1 = new HeroNode(1, "宋江", "及时雨");
        HeroNode hero2 = new HeroNode(2, "卢俊义", "玉麒麟");
        HeroNode hero3 = new HeroNode(3, "吴用", "智多星");
        HeroNode hero4 = new HeroNode(4, "林冲", "豹子头");
        HeroNode hero5 = new HeroNode(5, "李逵", "黑旋风");

        // 向链表中添加节点(乱序)
        singleLinkedList.addByOrder(hero2);
        singleLinkedList.addByOrder(hero5);
        singleLinkedList.addByOrder(hero1);
        singleLinkedList.addByOrder(hero4);
        singleLinkedList.addByOrder(hero3);

        // 输出链表
        singleLinkedList.showList();
    }
}

ここに画像の説明を挿入

トップに戻る


おすすめ

転載: blog.csdn.net/qq_45797116/article/details/113446911