interview-training
linked-list
c++
Visualizando…
Vantagens:
Remover nó em O(1)
Desvantagens:
Acessar nó qualquer em O(n)
Remover elemento:
Exercícios:
https://leetcode.com/problems/delete-node-in-a-linked-list/
https://leetcode.com/problems/remove-nth-node-from-end-of-list/
Inserir Elemento:
Construir lista a partir de um vector:
Deep copy:
Reverter Lista:
Exercícios:
https://leetcode.com/problems/reverse-linked-list/
https://leetcode.com/problems/reverse-nodes-in-k-group/
Printar lista:
Detecção de ciclo:
Técnica do ponteiro rápido e lento (floyd's Tortoise and Hare), o ponteiro rápido irá andar de dois em dois passos, enquanto que o lento andará de um em um, se os dois se encontrarem, é porque existe um ciclo.
Complexidade: O(n)
Extra: Como encontrar o início do ciclo?
Exercícios:
https://leetcode.com/problems/linked-list-cycle/
https://leetcode.com/problems/linked-list-cycle-ii/
Lista com random pointer:
Visualizando:
Como fazer deep copy?
Opção 1: usar um map <LinkedList*, LinkedList*> associando cada nó da lista original com sua cópia
Opção 2: criar uma lista encadeada em que os nós nas posições ímpares são os originais e nas posições pares são as cópias
Exercício:
https://leetcode.com/problems/copy-list-with-random-pointer/
MergeSort com lista encadeada:
Bem direto, bom para treinar, a parte que pode complicar é o merge de duas listas encadeadas, então segue uns exercícios para praticar justamente isso:
https://leetcode.com/problems/merge-two-sorted-lists/
https://leetcode.com/problems/merge-k-sorted-lists/
Questões ultra clássicas:
Somar dois números que estão na forma de lista encadeada:
Obs: atentar aos casos que precisa criar um novo nó
https://leetcode.com/problems/add-two-numbers/
Verificar se lista encadeada é um palíndromo:
Uma opção é reverter primeira metade da lista, andar na primera metade (revertida) e na segunda e verificar se os nós tem os mesmos valores
https://leetcode.com/problems/palindrome-linked-list/