7
votes

Moyenne point dans une liste de liaison dans une seule trershavation?

J'essaie de trouver le point d'une liste de liaison individuelle où commence une boucle. Ce que j'ai pensé de prendre 2 pointes * lent, * Fast One bouge avec deux fois la vitesse d'autre. Si la liste a une boucle, alors à un moment donné xxx

lente = rapide = rapide

peut y avoir une autre solution élégante de sorte que la liste soit traversée une seule fois?


11 commentaires

Traverser la liste, compter les nœuds, midspoint = nombre de nœuds / 2 arrondis au plus proche int


@peacemaker Vous devez toujours traverser la liste jusqu'à ce que le point central puis.


@KonRADRUDOLPH DROITE, 1 Traversal de la liste vous obtiendra le point médian, comme Op Demanda


@peaceMaker: Ce serait un parcours et demi.


Que font les points médians avec des boucles dans la liste? Voulez-vous trouver le début de la boucle?


@Willvousden non, vous ne ferez que traverser la liste une fois, comptant les nœuds que vous allez. Après la traversée, vous pouvez trouver le point médian simplement en divisant le nombre de nœuds par 2.


@peacemaker: Bien sûr, vous avez trouvé l'index du point central, mais vous devez y accéder. Dans le cas d'une liste liée, cela signifie une fois la traversée de la première moitié de la liste. Les listes liées ont une heure d'accès O (n).


@Willvousden ahh oui, bon point!


désolé gars je vous ai omis de vous enregistrer ... j'ai édité les ques ... J'ai fait une erreur..mais à nouveau sur le point de mi-point à nouveau prendre 2 pointres.slow et rapide, avec un déplacement rapide à deux fois la vitesse, quand je suis rapide == null, le Le pointeur lent sera à la mi-position, si aucun élément n'est étrange, mais avec des éléments paires, l'élément laissé à * lentement sera également l'élément moyen. Il s'agit d'une seule traversée ... Maintenant, répondez à la boucle?


@YUXiuli Désolé pour cette Miss Taped Ques .... Ya Je veux trouver le point de départ de la boucle dans une seule traversée.


Dupliquer de Stackoverflow.com/Questtions/2663115/...


3 Réponses :


2
votes

Je suppose que cette liste lié singulièrement se termine par NULL. Dans ce cas, le pointeur lent et le pointeur rapide fonctionneront. Parce que le pointeur rapide est double à la vitesse du ralenti, si le pointeur rapide atteint la fin de la liste, le pointeur lent doit être au milieu de celui-ci.


0 commentaires

4
votes

Votre idée d'utiliser deux marcheurs, un à deux fois la vitesse de l'autre fonctionnerait, mais la question la plus fondamentale que cela augmente est de choisir une structure de données appropriée? Vous devriez vous demander si vous avez vraiment besoin de trouver le point médian, et si oui, quelles autres structures pourraient être mieux adaptées pour y parvenir dans O (1) (constante)? Un tableau vous fournirait certainement une plus grande performance pour le milieu d'une collection, mais d'autres opérations sont plus lentes. Sans connaître le reste du contexte, je ne peux faire aucune autre suggestion, mais je vais suggérer de revoir vos besoins.


0 commentaires

2
votes

Je suppose que c'était une sorte de question d'entrevue.

Si votre liste a une boucle, alors de le faire en une seule trershasse, vous devrez marquer les nœuds comme visité que votre Walker rapide traverse la liste. Lorsque le walker rapide rencontre NULL ou un nœud déjà visité, l'itération peut se terminer et votre ralentisseur lent est au milieu.

Il existe de nombreuses façons de marquer le nœud comme visité, mais une carte ou un ensemble externe pourrait être utilisée. Si vous marquez le nœud directement dans le nœud lui-même, cela nécessiterait une autre traversée pour nettoyer la marque.

EDIT: Il ne s'agit donc pas de trouver le point médian, mais de la détection de boucle sans revisiter les nœuds déjà visités. Le marquage fonctionne aussi pour cela. Il suffit de traverser la liste et de marquer les nœuds. Si vous frappez NULL, pas de boucle. Si vous frappez un nœud visité, il y a une boucle. Si la marque comprend également un comptoir, vous savez même où la boucle commence.


4 commentaires

Et une autre chose à propos de ce point de midi, si vous rencontrez même des nœuds, il y aurait deux points à mi-temps, comment les trouver?


Vous déplacez la marchette lente après que le Walker rapide a déménagé. Le Walker rapide détermine si l'itération se poursuit ou non. Donc, pour un nombre pair, les centres de milieu sont la position actuelle du ralentisseur lent et de la suivante. Pour impair, la position actuelle du Walker est le point médian.


Supposons que nous ne connaissions pas la longueur de la liste et que nous devons le faire en une seule trershavation, puis que vous avez dit que nous déplacons le pointeur lent après le pointeur rapide et jusqu'à Fast = null, nous comptons également les nœuds, si des nœuds = même Ensuite, lent et lent-> Suivant donnerait la réponse si impair alors lent-> Suivant est la réponse ... est-ce juste ????


@ishansoni: Oui, vous comptez les nœuds. Pour impair, la réponse est juste lente, pas lente-> Suivant.