双链表

108 阅读1分钟
  • 这里主要用数组来模拟链表,也叫静态链表
  • 偷个懒,把head存入数组0索引中,和单链表优化版一样

模板

Snipaste_2023-02-28_18-52-43.png

Snipaste_2023-02-28_18-52-17.png

  • 注意,这里面的k + 1代表第k个插入的元素,因为idx是从k开始的
  • C++
// e[]表示节点的值,l[]表示节点的左指针,r[]表示节点的右指针,idx表示当前用到了哪个节点
int e[N], l[N], r[N], idx;

// 初始化
void init()
{
    //0是左端点,1是右端点
    r[0] = 1, l[1] = 0;
    idx = 2;
}

// 在节点k的右边插入一个数x
void insert(int k, int x)
{
    e[idx] = x;
    l[idx] = k, r[idx] = r[k];
    l[r[k]] = idx, r[k] = idx ++ ;
}

// 删除节点k
void remove(int k)
{
    l[r[k]] = l[k];
    r[l[k]] = r[k];
}

//从左往右输出链表
for (int i = r[0]; i != 1; i = r[i]) cout << e[i] << ' ';

//从右往左输出链表
for (int i = l[1]; i != 0; i = l[i]) cout << e[i] << ' ';
  • Java
public static int[N] e = new int[];
public static int[N] l = new int[];
public static int[N] r = new int[];
public static int idx;

public static void init() {
    r[0] = 1;
    l[1] = 0;
    idx = 2;
}

//在节点k的右边插入一个数x
public static void insert(int k, int x) {
    e[idx] = x;
    l[idx] = k;
    r[idx] = r[k];
    l[r[k]] = idx;
    r[k] = idx++;
} 

//在节点k的左边插入一个数x调用insert(l[k], x)即可
//在表头插入一个数调用insert(0,x)即可
//在表尾插入一个数调用insert(l[1], x)即可

public static void remove(int k) {
    l[r[k]] = l[k];
    r[l[k]] = r[k];
}

//从右往左输出链表
for (int i = r[0]; i != 1; i = r[i]) {
    pw.print(e[i] + " ");
}
//从左往右输出链表
for (int i = l[1]; i != 0; i = l[i]) {
    pw.print(e[i] + " ");
}

练习

01 双链表

  • 题目

Snipaste_2023-03-01_22-40-03.png

  • 题解
import java.io.*;

public class Main {
    public static final int N = 100010;
    public static int M;
    public static int[] e = new int[N];
    public static int[] l = new int[N];
    public static int[] r = new int[N];
    public static int idx;

    public static void init() {
        r[0] = 1;
        l[1] = 0;
        idx = 2;
    }

    public static void insert(int k, int x) {
        e[idx] = x;
        l[idx] = k;
        r[idx] = r[k];
        l[r[k]] = idx;
        r[k] = idx++;
    }

    public static void remove(int k) {
        l[r[k]] = l[k];
        r[l[k]] = r[k];
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
        M = Integer.parseInt(br.readLine());

        init();
        while (M-- > 0) {
            String[] str1 = br.readLine().split(" ");
            if (str1[0].equals("L")) {
                insert(0, Integer.parseInt(str1[1]));
            } else if (str1[0].equals("R")) {
                insert(l[1], Integer.parseInt(str1[1]));
            } else if (str1[0].equals("IL")) {
                insert(l[Integer.parseInt(str1[1]) + 1], Integer.parseInt(str1[2]));
            } else if (str1[0].equals("IR")) {
                insert(Integer.parseInt(str1[1]) + 1, Integer.parseInt(str1[2]));
            } else {
                remove(Integer.parseInt(str1[1]) + 1);
            }
        }

        for (int i = r[0]; i != 1; i = r[i]) {
            pw.print(e[i] + " ");
        }
        pw.close();
        br.close();
    }
}