2017-08-13 1 views
1

J'ai une liste générique liée et je peux vérifier si deux liste liée sont égales si chacune des valeurs de noeud sont identiques et sont dans l'ordre. J'ai une fonction qui divise la liste liée en deux parties et plus tard je veux vérifier que deux listes ont la même valeur dans son nœud.Comment deux listes génériques chaînées dans swift peuvent-elles être comparées?

func divideList(atIndex index:Int) -> (first: LLGeneric<T>?,second: LLGeneric<T>?) 

Je recherche pour mon cas d'utilisation où je peux vérifier palindrome dans la liste chaînée après la division, puis en comparant (après avoir renversé une liste).

Note: mon noeud de liste chaînée est quelque chose de générique comme

class LLGenericNode<T> { 
    var value: T 
    var next: LLGenericNode? 
    weak var previous: LLGenericNode? 
    init(_ value: T) { 
     self.value = value 
    } 
} 
+0

Vous souhaitez qu'une fonction vérifie si une liste est "palindrome"? –

+0

@LucaAngeletti, Non. Désolé pour la confusion. Ce que je cherche est une sorte de méthode permettant de comparer ces nœuds génériques. – manismku

Répondre

1

Afin de comparer les valeurs que vous devez exiger que T est Equatable:

class LLGenericNode<T: Equatable> { 
    // ... 
} 

Ensuite, vous pouvez mettre en œuvre == par comparer les valeurs en premier. Si les valeurs sont égales, les queues de liste sont comparées récursivement.

extension LLGenericNode: Equatable { 
    static func ==(lhs: LLGenericNode<T>, rhs: LLGenericNode<T>) -> Bool { 
     if lhs.value != rhs.value { 
      return false 
     } 
     switch (lhs.next, rhs.next) { 
     case (nil, nil): 
      // Both tails are == nil: 
      return true 
     case let (lvalue?, rvalue?): 
      // Both tails are != nil: 
      return lvalue == rvalue // Recursive call 
     default: 
      // One tails is nil and the other isn't: 
      return false 
     } 
    } 
} 
+0

c'est génial en particulier le changement de statut à l'intérieur "return lvalue == rvalue // appel récursif" – manismku