Loop infinito com ArrayList [RESOLVIDO]

Olá pessoal sou novo no fórum e estou com uma ou melhor duas duvidas em um código fonte de java no qual faz o seguinte: desenvolver uma classe Aluno que está abaixo

public class Aluno {

	private String nome;
	private double[] nota;
	final int qNotas = 3;
	
	public String getNome(){
		return nome;
	}
	public void setNome(String nome){
		this.nome = nome;
	}
	
	public Aluno(String nome, double n1, double n2, double n3){
		this.nome = nome;
		this.nota = new double[qNotas];
		this.nota[0] = n1;
		this.nota[1] = n2;
		this.nota[2] = n3;
	}
	
	public double media(){
		double soma = 0;
		for(double v: this.nota)
			soma = soma + v;
		return soma / qNotas;
	}
	
	public String toString(){
		String s = "Nome: "+this.nome+" \n Notas: ";
		for(double v: this.nota)
			s = s + v+", ";
		s = s +" \n Media: "+media();
		return s;
	}
}

O primeiro é o seguinte: o problema está no main pois o mesmo entra em loop infinito. A função do programa é a seguinte pedir para o usuário digitar o nome de um aluno e três notas e armazenar em um ArrayList até que o nome seja diferente de fim. No entanto o programa pede para digitar pela primeira vez o nome se for diferente do fim entra no loop mas não sai pois apos ele ler as três notas ele pede para digitar o nome novamente mas logo em seguida sem nem mesmo ler o nome solicita para digitar as três notas novamente.
Desde já agradeço!

import java.util.ArrayList;
import java.util.Iterator;
import java.util.Scanner;

public class TestaAluno {
	
	public static void main(String[] args) {
		Scanner s = new Scanner(System.in);
		ArrayList<Aluno> turma = new ArrayList<Aluno>();
		String nome;
		double n1, n2, n3;
		System.out.println("Digigte o nome do aluno: ");
		nome = s.nextLine();
		//loop infinito
		while(nome.equals("fim") == false){
			System.out.println("Digite a nota 1 do aluno: ");
			n1 = s.nextDouble();
			System.out.println("Digite a nota 2 do aluno: ");
			n2 = s.nextDouble();
			System.out.println("Digite a nota 2 do aluno: ");
			n3 = s.nextDouble();
			
			Aluno a = new Aluno(nome, n1, n2, n3);
			a.setNome(nome);
			a.media();
			turma.add(a);
			
			System.out.println("Digite o nome do aluno: ");
			nome = s.nextLine();
                        //solicita que o usuário digite mas não lê
		}
		
		Iterator<Aluno> it = turma.iterator();
		while(it.hasNext() == true){
			System.out.println("Nome: "+it.next().getNome()+" Media: "+it.next().media());
		}
	}
}

Um teste para visualização do problema

Digigte o nome do aluno:
diego
Digite a nota 1 do aluno:
10
Digite a nota 2 do aluno:
9
Digite a nota 2 do aluno:
7
Digite o nome do aluno:
Digite a nota 1 do aluno:

Observem que não consigo digitar o nome pois imediatamente se pede a nota novamente.

tente mudar a seu while

while(!"fim".equals(nome)){
}

Não surtiu efeito continuo com o mesmo problema.

O loop funciona perfeitamente quando as notas são passadas diretamente pelo construtor sem pedir ao usuário. Por que isso ocorre?

Coloca outro s.nextLine() antes de nome = s.nextLine();
O Iterator também não está correto. O código abaixo mostra as alterações (as linhas alteradas estão com o comentário //ALTERADO):

import java.util.ArrayList;
import java.util.Iterator;
import java.util.Scanner;

class Aluno {

	private String nome;
	private double[] nota;
	final int qNotas = 3;
	
	public String getNome(){
		return nome;
	}
	public void setNome(String nome){
		this.nome = nome;
	}
	
	public Aluno(String nome, double n1, double n2, double n3){
		this.nome = nome;
		this.nota = new double[qNotas];
		this.nota[0] = n1;
		this.nota[1] = n2;
		this.nota[2] = n3;
	}
	
	public double media(){
		double soma = 0;
		for(double v: this.nota)
			soma = soma + v;
		return soma / qNotas;
	}
	
	public String toString(){
		String s = "Nome: "+this.nome+" \n Notas: ";
		for(double v: this.nota)
			s = s + v+", ";
		s = s +" \n Media: "+media();
		return s;
	}
}


public class TestaAluno {
	
	public static void main(String[] args) {
		Scanner s = new Scanner(System.in);
		ArrayList<Aluno> turma = new ArrayList<Aluno>();
		String nome;
		double n1, n2, n3;
		System.out.println("Digigte o nome do aluno: ");
		nome = s.nextLine();
		//loop infinito
		while(nome.equals("fim") == false){
			System.out.println("Digite a nota 1 do aluno: ");
			n1 = s.nextDouble();
			System.out.println("Digite a nota 2 do aluno: ");
			n2 = s.nextDouble();
			System.out.println("Digite a nota 2 do aluno: ");
			n3 = s.nextDouble();
			
			Aluno a = new Aluno(nome, n1, n2, n3);
			a.setNome(nome);
			a.media();
			turma.add(a);
			
			System.out.println("Digite o nome do aluno: ");
			s.nextLine(); //ALTERADO
			
			nome = s.nextLine();
                        //solicita que o usuário digite mas não lê
		}
		
		Iterator<Aluno> it = turma.iterator();
		while(it.hasNext() == true){
			Aluno aluno = it.next(); //ALTERADO
			System.out.println("Nome: "+aluno.getNome()+" Media: "+aluno.media()); //ALTERADO
		}
	}
}

A explicação do problema pode ser encontrada aqui:

Ok agora deu certo mas o tem um errinho na classe Aluno
linha 23: o correto seria.

   this.nota[2] = n3;

Verdade. Corrigi na listagem a linha 23.
[]'s