2016-03-14 58 views
0

我想確定我的鏈表是否爲空,但是,我不能通過檢查head.next == tail來做到這一點,因爲我會得到一個錯誤,即二元運算符「==」不能應用於'LLNode?'類型的操作。Swift中的循環鏈表

import Foundation 

class LLNode<T> { 
    var key: T! 
    var next: LLNode? 
    var previous: LLNode? 
} 

public class LinkedList<T: Equatable> { 
    private var head: LLNode<T> = LLNode<T>() 
    private var tail: LLNode<T> = LLNode<T>() 

    init() { 
     head.next = tail 
     head.previous = tail 
     tail.next = head 
     tail.previous = head 
    } 

    func isEmpty() { 
     return head.next == tail ? true : false 
    } 
} 
+0

對不起,應該是FUNC的isEmpty() - >布爾 –

+1

你需要讓'LLNode '符合[Equatable協議](https://developer.apple.com/library/ios/documentation/Swift/Reference/Swift_Equatable_Protocol/) –

+1

只是一個FYI,'=='運算符爲您提供了一個'Bool'值已經,所以完全沒有必要''?真:假'結束。事實上,任何時候你看到有人這樣做,總是沒有必要的,因爲顯然''左邊的'已經是'Bool'值。如果他們交換'true'和'false',他們可以使用'!'運算符來翻轉該值,或者使用'!='而不是'=='。 – Gavin

回答

2

在這種情況下,你可能應該如果headtail是通過使用===運營商相同的實例檢查。請注意,這與在Swift中測試相等性不同。

==檢查對象相等性,您必須自己定義,而===確定兩個變量是否引用同一個實例。因此,您的檢查應該是這樣的:

func isEmpty() -> Bool { 
    return head.next === tail 
} 

三元運算符是沒有必要的,因爲比較運營商已經返回一個布爾值。

+0

謝謝!有用! –

+0

還有一個簡單的問題,這個班的尾巴是否有必要?似乎沒有關係,如果我沒有在循環鏈表中有一個尾巴。 –

+0

根據定義,循環鏈表是一個鏈表,其中頭部與尾部相同。所以是的,你是對的。你只需要存儲一次。在這種情況下,測試將是'head.next ===頭部'。 – colavitam

0

您可以LLNode符合Equatable協議,但這意味着必須約束T: Equatable所有LLNode了。

如果我是做最小的改動你的代碼,使其工作,這裏是如何我會把它:

func isEmpty() -> Bool { 
    if let next = head.next where next.key == tail.key { 
     return true 
    } else { 
     return false 
    } 
} 
+0

如果LinkedList的內容保證是唯一的,那麼這隻會工作嗎?如果相同的值重複兩次,比較節點所保存的值可能會導致錯誤的結論。 – colavitam

+0

我的猜測是基於'T:Equatable'約束和'LLNode'中有'key'屬性的事實。如果操作系統意味着它被用作字典中的密鑰,那麼是的,每個節點都必須具有唯一的密鑰 –