2017-08-13 6 views
1

私は一般的なリンクリストを持っており、ノード値のそれぞれが同じで、順序が合っていれば、2つのリンクリストが等しいかどうかを調べることができます。 リンクされたリストを2つの部分に分割し、後で2つのリストがそのノードに同じ値を持っているかチェックしたいと思う機能があります。どのようにして迅速な2つの一般的なリンクリストを比較できますか?

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

私は分割した後、(1リストを逆にした後)を比較した後、リンクリストに回文を確認することができ、私のユースケースのためにそれを見ています。

注:私のリンクリストのノードを使用すると、TEquatableであることを要求しなければならない値を比較するために

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

リストが「パリンドローム」であるかどうかをチェックする機能が必要ですか? –

+0

@LucaAngeletti、いいえ、混乱して申し訳ありません。私が目立つように探しているのは、これらの一般的なノードを比較する方法です。 – manismku

答えて

1

のような一般的なものである:

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

次にあなたがで==を実装することができます最初に値を比較する。 値が等しい場合、リストテールは再帰的に比較されます。

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

これは特に "return lvalue == rvalue // Recursive call"内のswitch文です。 – manismku

関連する問題