Considerando listas de valores inteiros, implemente uma função que receba como parâmetro uma lista e um valor n e divida a lista em duas, de tal forma que a segunda lista começa no primeiro nó após o valor n. A função deve retornar a segunda lista.

Passo 1

A gente tem uma lista simplesmente encadeada de inteiros e um valor n, e precisa cortar essa lista em dois pedaços: a primeira permanece do começo até o nó cujo valor é n, e a segunda começa no nó seguinte. O conteúdo é manipulação de listas encadeadas e vamos precisar percorrer a lista e ajustar ponteiros.

Passo 2

Para achar onde cortar, usamos um ponteiro auxiliar current que percorre a lista comparando current->data com n. Saímos do laço quando encontramos o nó com valor igual a n ou chegamos ao fim (current == NULL).
Se current == NULL, significa que não achamos o valor n em nenhum nó. Nesse caso não podemos fazer a divisão, então retornamos NULL (lista vazia).

Passo 3

Se current não for NULL, salvamos o próximo nó (current->next) numa variável newHead. Esse newHead vai ser a cabeça da segunda lista.
Agora quebramos o vínculo entre as duas listas: fazemos current->next = NULL, para encerrar a primeira lista no nó n. Por fim retornamos newHead, que é a cabeça da segunda lista.

Resposta

// Definição básica do nó
typedef struct Node {
int data;
struct Node *next;
} Node;
// Função que divide a lista em duas e retorna a segunda lista
Node* splitList(Node *head, int n) {
Node *current = head;
// 1) Encontrar o nó com valor n
while (current != NULL && current->data != n) {
current = current->next;
}
// 2) Se não achou n, não há divisão
if (current == NULL) {
return NULL;
}
// 3) Guarda a cabeça da segunda lista
Node *secondHead = current->next;
// 4) Corta a lista, encerrando a primeira em current
current->next = NULL;
// 5) Retorna a segunda lista
return secondHead;
}

Exercícios relacionados