IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Fusion de deux listes chainées


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 37
    Par défaut Fusion de deux listes chainées
    Bonjour,

    Je dois réaliser la fusion de deux listes chaînées. J'ai une contrainte qui m'impose de réaliser la fusion en temps constant.

    J'ai donc implémenté ma liste chainée qui possède deux références :
    - une sur mon maillon de tête (front)
    - une sur ma maillon de fin (tail)

    Mes données contenues dans mes maillons possède un objet et lien vers le maillon suivant (next).

    Pour fusionner une liste (list2) à une autre (list1), je fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    list1.tail.setNext(list2.front);
    list1.tail = list2.tail
    La fusion se passe correctement en temps constant.
    Mon problème vient du fait que je dois par la suite modifier ma deuxième liste. Cela engendre des changements dans ma première liste que je ne souhaite pas.
    J'aimerais spécifier que le list1.tail.next est différent du list2.tail.next mais je ne trouve pas de solution.

    Qqn aurait-il une idée?
    Si je n'ai pas été clair, faites le savoir!

    merci d avance!

  2. #2
    Membre Expert Avatar de Ivelios
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2008
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 031
    Par défaut
    Soit tu modifies la seconde liste avant de la fusionner avec la première.
    Soit tu stockes list2.front quelque part. Et pour la modification, tu commences à list2.front puis tu fais des next().

    Il n'y a pas d'autres solutions.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 37
    Par défaut
    Je ne comprends pas vraiment ta réponse!
    Justement mon but est d'éviter que les changements apportés sur la deuxieme liste ne se repercute sur la première.

    Soit tu modifies la seconde liste avant de la fusionner avec la première.
    En faitsant comme ça, vu que les changements sont déjà apportés à la deuxième liste, d'office les éléments apportés seront dans ma première liste.

    Soit tu stockes list2.front quelque part. Et pour la modification, tu commences à list2.front puis tu fais des next().
    Et si je parcours la list2 à partir de list2.front en faisant des next(), ca fait exactement ce que je ne souhaite pas!?
    Donc je ne comprends pas très bien le but de faire ca!

    Merci d'avoir lu ma question

  4. #4
    Membre Expert Avatar de Ivelios
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2008
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 031
    Par défaut
    Je pense comprendre pourquoi je n'ai pas compris.
    Pour toi la première liste est aussi la liste fusionné.

    Bref, si je comprend bien :
    1/ Soit une liste L1
    2/ Soit une liste L2
    3/ Soit une liste L3 = L1|L2 ( où | = fusion )

    Problème, quand tu modifie L2, L3 est aussi modifié.

    Si c'est bien ça c'est normal. L3 et L2 possèdent des références vers les mêmes objets. Donc quand tu modifie dans un, ça modifie forcément dans l'autre.
    Solution : Créer une L2bis, qui est la copie exact de L2. Et c'est L2bis que tu fusionne avec L1 (L1|L2bis = L3)
    Pour créer une copier, tu parcours ta liste(L2) et tu en crée une autre(L2bis) en même temps en la remplissant.

  5. #5
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Je ne vois pas de solution qui puisse être en temps constant et qui remplisse tes deux conditions, car de ce que je comprend tu souhaites pouvoir cloner tes objets ... ce qui nécessite forcément de la parcourir (donc, temps linéaire).

  6. #6
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Par défaut
    Citation Envoyé par Rei Ichido Voir le message
    Je ne vois pas de solution qui puisse être en temps constant et qui remplisse tes deux conditions, car de ce que je comprend tu souhaites pouvoir cloner tes objets ... ce qui nécessite forcément de la parcourir (donc, temps linéaire).
    Je proposes un "lenient-cloning"
    +1

    A la rigueur on peut "limiter" l'impact linéaire sur une liste non chaînée avec System.arraycopy.
    Java : Cours et tutoriels - FAQ - Java SE 8 API - Programmation concurrente
    Ceylon : Installation - Concepts de base - Typage - Appels et arguments

    ECM = Exemple(reproduit le problème) Complet (code compilable) Minimal (ne postez pas votre application !)
    Une solution vous convient ? N'oubliez pas le tag
    Signature par pitipoisson

Discussions similaires

  1. Fusion de deux listes d'une façon bien particulière
    Par blackskiz dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 14/10/2014, 19h57
  2. [Turbo Pascal] Fusion de deux listes chaînées ordonnées
    Par attilaz dans le forum Turbo Pascal
    Réponses: 0
    Dernier message: 15/05/2012, 22h27
  3. Fusion de deux listes déroulante
    Par chtrousselle dans le forum Excel
    Réponses: 1
    Dernier message: 21/06/2011, 09h14
  4. la concaténation de deux listes chainées
    Par hindou90 dans le forum C
    Réponses: 10
    Dernier message: 19/02/2010, 09h20
  5. fusion de deux liste simplement chainée
    Par mdh12 dans le forum Débuter
    Réponses: 6
    Dernier message: 14/01/2010, 19h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo