《蓝桥杯预备专题》每日算法_单链表

51 阅读1分钟

问题描述

在这里插入图片描述

解题思路

  • 之所以不采用结构体的方式定义链表结点,是因为每创建一个新结点就要new一次,可能会超时,所以用数组模拟一个静态链表

  • 一个数组存储元素,一个数组存储当前元素的下一个元素的索引

  • 涉及三种操作:

    • 头插法插入数据
    • 指定位置插入数据
    • 删除指定位置的数据
  • 其实保存数据的索引是从零开始递增的,只不过是通过另一数组规定了元素指向【后期利用这个元素前后的关系来遍历】

代码部分

import java.util.Scanner;

public class Main{
    static final int N = 100010;
    // idx 代表下一个插入的下标,head代表头结点
    static int idx = 0;
    static int head = -1;
    // e 代表元素,ne代表next指向的下标
    static int [] e = new int[N];
    static int [] en = new int[N];
        
    public static void main(String [] args){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        for(int i = 0; i < n; i++){
            char c = sc.next().charAt(0);
            if(c == 'H'){
                int num = sc.nextInt();
                insertFromHead(num);
            }else if(c == 'D'){
                int k = sc.nextInt();
                remove(k);
            }else if(c == 'I'){
                int k = sc.nextInt();
                int num = sc.nextInt();
                
                insertFromK(k, num);
            }
        }
        
        print();
        
    }
    
    // H头插法插入数据
    public static void insertFromHead(int x){
        // 创建新结点,让新结点指向头结点的下一个结点,让头结点指向新结点
        e[idx] = x;
        en[idx] = head;
        head = idx;
        // 更新
        idx++;
    }
    
    // I在第k个插入的元素后再插入一个元素
    public static void insertFromK(int k, int x){
        // 先要找到第k个元素的位置 >> k - 1
        e[idx] = x;
        en[idx] = en[k - 1];
        en[k - 1] = idx;
        idx++;
    }
    
    // D删除第k个插入的元素后面的那个元素
    public static void remove(int k){
        if(k == 0){
            head = en[head];
        }else{
            en[k - 1] = en[en[k - 1]];
        }
    }
    
    // 遍历链表
    public static void print(){
        for(int i = head; i != -1; i = en[i]){
            System.out.print(e[i] + " ");
        }
    }
}