Tabela de Espalhamento e Lista Ligada

Pessoal, tenho o código abaixo, e quando tento executar a opção de Adicionar dados na Tabela De Espalhamento, obtenho a seguinte mensagem:

Exception in thread “main” java.lang.NullPointerException
at tabelaespalhamento.TabelaDeEspalhamento.addTabEspalha(TabelaDeEspalhamento.java:22)
at main.TestaTabelaEspalhamento.main(TestaTabelaEspalhamento.java:31)

LINHA 22 - (método addTabEspalha) : this.lista[funcaoEspalhamento(cPos)].addDestino(cDest);
LINHA 31 - (TestaTabelaEspalhamento) : tabela.addTabEspalha(ori, des);

Agora o código completo ( estou omitindo packages e métodos que não importam à dúvida que coloco aqui):

public class No {

	public char destino;
	public No prox;
	
	public No(char c){
		this.destino = c;
		prox = null;		
	}
}

// LISTALIGADA INSTANCIA NO
Public class ListaLigada {

	public No inicio;

	public ListaLigada(No inicio) {
		this.inicio = null;
	}

	public void addInicio(char c) {
		No novo = new No(c);
		novo.prox = inicio;
		inicio = novo;
	}
}

//TABELA DE ESPALHAMENTO

public class TabelaDeEspalhamento {

	public ListaLigada[] lista;

	public TabelaDeEspalhamento() {
		this.lista = new ListaLigada[52];
	}

	public int funcaoEspalhamento(char cH) {
		if (cH < 91) {
			return cH - 65;
		} else {
			return cH - 71;
		}
	}

	public void addTabEspalha(char cPos, char cDest) {
		this.lista[funcaoEspalhamento(cPos)].addDestino(cDest);
	}
}

// MAIN

public class TestaTabelaEspalhamento {
	public static void main(String args[]) {
		TabelaDeEspalhamento tabela = new TabelaDeEspalhamento();

		int opt = -1;

		while (opt != 99) {
			opt = Integer.parseInt(
					JOptionPane.showInputDialog("Opção desejada: \n " + "\t\t 1 - Adicionar Origem - Destino.\n"
							+ "\t 99 -Encerrar. "));
			String origem = " ";
			String destino = " ";
			char ori;
			char des;
			switch (opt) {

			case 1:
				origem = JOptionPane.showInputDialog("Origem?  ", "Digite Origem :");
				destino = JOptionPane.showInputDialog("Destino? ", "Digite destino :");
				ori = origem.charAt(0);
				des = destino.charAt(0);
				tabela.addTabEspalha(ori, des);
				break;

			case 99:
				System.out.println("Saindo do programa");
				break;

			default:
				JOptionPane.showMessageDialog(null, "Opção inválida");
				break;
			}
		}
	}
}

No construtor da classe TabelaDeEspalhamento você está criando um array de ListaLigada :

this.lista = new ListaLigada[52];

Mas em nenhum momento você está criando os elementos dessa lista, que seria algo assim:

for (i = 0; i < this.lista.length; i++){
  this.lista[i] = new ListaLigada();
}

Pois aí não haveria erro quando você faz

this.lista[funcaoEspalhamento(cPos)].addDestino(cDest);

Pois a posição cPos do array lista[] seria um objeto válido.

Entretanto, acho que tem algo confuso nesse código. Você precisa mesmo de um array de ListaLigada como está fazendo, ou uma lista só para todos os elementos seria suficiente?

Abraço.