Wie bekommt man den index einer Zahl in eine verkettete Liste?
Ich habe eine verknüpfte Liste wie folgt aufgebaut:
LinkedList<int> linked = new LinkedList<int>();
var array = new int[] { 23, 55, 64, 65 };
foreach (var item in array)
{
linked.AddLast(item);
}
Wie finde ich den index der Zahl 64?
Wenn Sie eine Auflistung benötigen, basierend auf den Indizes, sollten Sie die Verwendung
Warum nicht LinkedList(T) implementieren, die die IList - (T) - interface?
Sind Sie sicher, dass
ja , ich habe die Verwendung
Der andere Weg, um how-do-i-get-the-n-th-element-in-a-linkedlistt
List<T>
anstelle einer verlinkten Liste.Warum nicht LinkedList(T) implementieren, die die IList - (T) - interface?
Sind Sie sicher, dass
LinkedList
geeignet ist für dein problem?ja , ich habe die Verwendung
LinkedList
Der andere Weg, um how-do-i-get-the-n-th-element-in-a-linkedlistt
InformationsquelleAutor Smartboy | 2012-11-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist der einzige Weg, um zu überprüfen, element durch element und einen Zähler erhöhen ("nur Weg", sage ich, dass andere Methoden wie LINQ müssen, um die gleiche Sache intern).
Einer hand-SCHRIFTLICHEN-Erweiterung Methode würde wie folgt Aussehen:
Aber es kann leicht getan werden mit LINQ als @L. B schrieb (nachgeben der gleichen Zeit, Komplexität).
Dank alot @Groo
danke, aber LINQ ist nicht schwer, sobald Sie sich daran gewöhnen. Ich habe auch lieber LINQ über manuell Durchlaufen, es ist übersichtlicher. Dies war nur gedacht, um zu zeigen, der Algorithmus.
InformationsquelleAutor Groo
Sinnlos, mit einem circular linked list. @Smartboy: Das ist linq,
Enumerable.Select
undEnumerable.Where
integrieren kann, das element index.Ich muss etwas fehlen. Wie erstellen Sie eine kreisförmig verkettete Liste von
LinkedList<int>
?wenn Sie ein
Select
extension-Methode, verwendet esLinkedList
s Durchführung derIEnumerable
einfach iterieren durch die Elemente, ein zu einer Zeit. DieSelect
Methode projiziert dann jedes element in eine neue Instanz einer anonymen Klasse mit zwei Eigenschaften (Element Wert"item"
, und seinen index"inx"
), und dieFirst
Methode akzeptiert dann eine anonyme Methode, die Angabe einer search-Prädikat (dauert einint
gibt einebool
) und gibt das erste element erfüllt die Bedingung. Ein kleines problem mitFirst
ist, dass es löst eine Ausnahme aus, wenn kein Element abgestimmt ist.href="http://stackoverflow.com/a/2670199/284240">stackoverflow.com/a/2670199/284240
InformationsquelleAutor L.B
Hier ist eine Alternative für LINQ-Implementierung, vermeidet das erstellen von anonymen Objekten und gibt -1 zurück wenn das Element nicht in der Liste:
Er konvertiert die Sequenz von zahlen, um eine Sequenz mit dem index der übereinstimmung oder
null
sonst. Es findet die erste von diesen, wenn es einer ist, ansonsten wandelt die Standard -int?
zu-1
.Edit:
Ist hier besser (einfacher und schneller) alternative:
i
wird entweder gleich dem index, oder gleichlinked.Count
wenn der Wert64
wurde nicht gefunden.InformationsquelleAutor Matthew Strawbridge
Ich denke, Sie sollten Ihre eigene Funktion zum Parsen der Liste und überprüfen. Die "Suchen" - Funktion gibt nur das erste vorkommen,und für Sie, es möglich ist 2 oder mehr vorkommen von 64 in der Liste.
IndexOf
auf die gleiche Weise funktioniert.InformationsquelleAutor Florin Petriuc
Können Sie ein make-up. 🙂 Ich fand diese Frage versucht herauszufinden, wie qsort eine verknüpfte Liste. Und es traf mich, da bin ich Sortier-Strukturen trotzdem alles, was ich tun müssen, ist geben Sie jeweils einen eindeutigen identifier. Das wird wahrscheinlich die Reihenfolge, in der Sie entstanden sind. Fügen Sie einfach ein int-Feld namens oder seq idx jedem Knoten. Ändern Sie Ihre ints zu Strukturen mit den ints innen und legen noch ein int Feld, dass Ihre improvisierten index. Durchlaufen der Liste wird sehr umständlich sein. Aber Sie binden die original-ints Indizes.
Wenn Sie nicht erwarten, dass die Daten zu bewegen, Sie bauen konnte ein array von Zeigern auf Elemente in der verknüpften Liste. Am Anfang starten, verwenden Sie den Mauszeiger weiter, machen weiter und zählen, wie viele hops. Dann weisen Sie Ihre array, an den Anfang der Liste wieder und der Datensatz in das array die Adressen der nächsten Zeiger. Aber jemand oder etwas (ein anderer thread?) könnte es vermasseln durch verschieben oder hinzufügen oder entfernen Sie ein element. Die Liste würde weiter arbeiten, aber das array müsste verschrottet und erneuert. Könnte relativ schnell sein, aber wie erkennen die Veränderung zuverlässig?
Runder? Verwenden Sie einfach modulo so vorwärts idx = (idx + 1) % N", wobei N die Gesamtzahl der Felder. Für den normalen C jedenfalls, ich weiß nicht, was C#'s Grenzen sind.
InformationsquelleAutor Alan Corey