Concatenation of two linked lists

4

The problem is:

  

Write a program and make a function to concatenate two lists of integers in a third list that should be returned by the function, in C #.

My only question is how to concatenate the list.

Code of the class that represents the list ( Lista )

using System;

namespace ListaLib
{
    public class Lista
    {
        /// <summary>
        /// Referência do primeiro nó (elemento) da lista
        /// </summary>
        public NoLista InicioLista { get; set; }

        /// <summary>
        /// Construtora da classe lista
        /// </summary>
        public Lista()
        {
            InicioLista = null;
        }

        /// <summary>
        /// Remove um valor da lista
        /// </summary>
        /// <param name="valor">Valor a ser removido</param>
        /// <returns>true se encontrar e false se não encontrar</returns>
        public bool Remove(int valor)
        {
            bool valorRetorno = false;

            NoLista auxiliar = InicioLista;

            // Verificar se a lista está vazia
            if (auxiliar != null)
            {
                // Percorrer  lista (navegar) até achar o nó com o valor desejado
                while ((auxiliar != null) && (auxiliar.informacao != valor))
                {
                    // Passa para o próximo elemento da lista
                    auxiliar = auxiliar.proximo;
                }

                // So atualizar a lista se o valor foi encontrado
                if (auxiliar.informacao == valor)
                {
                    // Verificar se existe um proximo elemento na lista
                    if (auxiliar.proximo != null)
                    {
                        // Remover a referencia do nó anterior
                        (auxiliar.proximo).anterior = null;
                    }

                    // Verificar se é o primeiro da lista
                    if (InicioLista.informacao == valor)
                    {
                        InicioLista = InicioLista.proximo;
                    }
                    else
                    {
                        // Verificar se existe um proximo elemento na lista
                        if (auxiliar.proximo != null)
                        {
                            (auxiliar.proximo).anterior = auxiliar.anterior;
                        }

                        // Fazer o anterior do auxiliar apontar para o proximo do auxiliar
                        (auxiliar.anterior).proximo = auxiliar.proximo;
                    }
                }
            }

            return valorRetorno;
        }

        /// <summary>
        /// Adiona um novo valor na lista
        /// </summary>
        /// <param name="valor">Valor a ser adicionado</param>

        public void Add(int valor)
        {
            NoLista novoNo = new NoLista();
            novoNo.informacao = valor;

            // Verificar se é o primeiro da lista
            if (InicioLista == null)
            {
                InicioLista = novoNo;
            }
            else
            {
                NoLista auxiliar = InicioLista;

                while (auxiliar.proximo != null)
                {
                    auxiliar = auxiliar.proximo;
                }

                auxiliar.proximo = novoNo;
                novoNo.anterior = auxiliar;
            }
        }


        }

        public void Imprime()
        {
            NoLista auxiliar = InicioLista;
            Console.WriteLine("Imprimindo a lista");

            // Percorrer a lista até o fim
            while (auxiliar != null)
            {
                // Imprimir o valor
                Console.WriteLine(auxiliar.informacao);

                // Navegar para o próximo nó
                 auxiliar = auxiliar.proximo;
            }
        }
    }

The class representing the nodes in this list ( NoLista )

namespace ListaLib
{
    public class NoLista
    {
        /// <summary>
        /// Aramazena a informação
        /// </summary>
        public int informacao { get; set; }

        /// <summary>
        /// Referência para o próximo nó (elemento) na lista
        /// </summary>
        public NoLista proximo { get; set; }


        /// <summary>
        /// Referência para o nó (elemento) anterior na lista
        /// </summary>
        public NoLista anterior { get; set; }

        /// <summary>
        /// Construtora da classe NoLista
        /// </summary>
        public NoLista()
        {
            informacao = -1;
            proximo = null;
            anterior = null;
        }


    }
}
    
asked by anonymous 01.09.2017 / 12:36

1 answer

7

This can be done in two different ways.

The first is to concatenate the nodes of the second list in the first, that is, modify the first list and add all nodes in the other list. This would be more interesting if it were an internal method of Lista .

The code would look like this:

public void Concat(Lista toConcat)
{
    var no = InicioLista;

    while(no.proximo != null){
        no = no.proximo;
    }

    no.proximo = toConcat.InicioLista;
    toConcat.InicioLista.anterior = no;
}

The second way to do this is to create a third list, which has all the elements of the previous two. In order to do this there is not much mystery, you will need to go through all the elements of the two lists and add them in another.

The code could look like this:

public static Lista Concatenar (Lista l1, Lista l2) 
{
    var novaLista = new Lista();
    Add(novaLista, l1);
    Add(novaLista, l2);
    return novaLista;
}

private static void Add(Lista nova, Lista velha)
{
    NoLista p = velha.InicioLista;      
    nova.Add(p.informacao);   

    while (p.proximo != null) {
        p = p.proximo;          
        nova.Add(p.informacao);
    }
}

See the two versions working in .NET Fiddle.

    
01.09.2017 / 15:11