[Structure de données et algorithme] Liste liée unique (SingleLinkedList)



Liste liée

1. Introduction à la structure de stockage de la mémoire de la liste chaînée

Insérez la description de l'image ici

  • La liste chaînée est stockée sous la forme de nœuds, qui est un stockage en chaîne

  • Chaque nœud contient data 域: 当前节点的值, next 域:指向下一个节点

  • Les nœuds de la liste chaînée ne sont pas nécessairement stockés en continu ---- 靠next域进行节点间的连接指向,最后链表的以NULL值结束
    Insérez la description de l'image ici

  • La liste chaînée est divisée en une liste chaînée avec un nœud principal et une liste liée sans nœud principal, qui est déterminée en fonction des besoins réels

Retour au sommet


2. Introduction à la structure logique de la liste chaînée

Insérez la description de l'image ici

  • La structure dite logique est en fait une structure en chaîne formée en connectant les nœuds de la liste chaînée en séquence jusqu'à la fin.

Retour au sommet


3. L'exemple d'application de liste liée à une seule liaison est réalisé en utilisant une liste à chaîne unique avec la gestion du classement head-Water Margin Heroes

♑ Lors de l'ajout d'un héros, ajoutez-le directement à la fin de la liste liée

Insérez la description de l'image ici

Liste liée unique

  • Principales 构建含有头节点的单链表caractéristiques: 实现链表节点的添加,,链表的输出
  • Utilisez la classe de nœuds pour créer des nœuds principaux fixes
  • Méthode d'ajout d'éléments de liste liés: ajoutez directement des nœuds à la fin de la liste liée.Pour ajouter un nœud directement à la fin de la liste chaînée, il faut d'abord revenir à la structure de la liste chaînée, la liste chaînée 最后节点的特点 ---- next域为null, pour saisir ce point, on parcourt la liste chaînée lors de l'ajout de nœuds, trouver le dernier ( temp.next = null) de la liste chaînée actuelle , puis ajoutez le nouveau Le champ suivant assigné par le nœud au dernier nœud ( temp.next = heroNode)
  • Notez que dans tout le processus que nous introduisons 辅助节点temp, attribuez-lui les attributs du nœud principal et laissez-le représenter le nœud principal à comparer à son tour. En un sens, temp peut être considéré comme un pointeur. La clé pour introduire des nœuds auxiliaires est que le nœud principal n'est pas autorisé.
  • De même, lors de la sortie de la liste chaînée, le nœud auxiliaire est également utilisé pour la sortie de traversée.
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;
        }
    }
}

Classe de nœud

  • La fonction principale:创建节点
  • Déclarez la structure du nœud et les informations qu'il contient
// 创建节点,每个节点就是一个对象
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 + '\'' +
                '}';
    }
}

test

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();
    }
}

Insérez la description de l'image ici

Retour au sommet


♑ Lors de l'ajout d'un héros, insérez le héros dans la position spécifiée selon le classement

Insérez la description de l'image ici
Réaliser la méthode d'ajout en fonction du classement

  • La fonction principale:找到排名位置进行节点插入
  • Ici , il y a deux exigences principales: 1.对链表的添加元素实行有序添加;2.对于已存在编号的元素舍弃添加
  • Sur la base de la méthode add () directement ajoutée à la fin de la liste chaînée, la difficulté est de trouver l'emplacement où le nouveau nœud est ajouté. Le soi-disant ordre est basé sur les informations numériques du nœud ( no), puis nous comparons les nombres et utilisons toujours le nœud auxiliaire pour la traversée.
  • Lors de la traversée 辅助节点.nextet des 新节点nombres pour la comparaison de taille (voir la liaison de la figure sera plus facilement comprise), après avoir obtenu la position, le champ suivant sera dirigé dans la liste des séries.
// 进行排名添加
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;
    }
}

test

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();
    }
}

Insérez la description de l'image ici

Retour au sommet


Je suppose que tu aimes

Origine blog.csdn.net/qq_45797116/article/details/113446911
conseillé
Classement