題目
鏈表組件
問(wèn)題:
給定一個(gè)鏈表(鏈表結(jié)點(diǎn)包含一個(gè)整型值)的頭結(jié)點(diǎn) head。同時(shí)給定列表 G,該列表是上述鏈表中整型值的一個(gè)子集。返回列表 G 中組件的個(gè)數(shù),這里對(duì)組件的定義為:鏈表中一段最長(zhǎng)連續(xù)結(jié)點(diǎn)的值(該值必須在列表 G 中)構(gòu)成的集合。
說(shuō)明:
應(yīng)當(dāng)保持奇數(shù)節(jié)點(diǎn)和偶數(shù)節(jié)點(diǎn)的相對(duì)順序。
鏈表的第一個(gè)節(jié)點(diǎn)視為奇數(shù)節(jié)點(diǎn),第二個(gè)節(jié)點(diǎn)視為偶數(shù)節(jié)點(diǎn),以此類推。
示例:
示例 1:
head: 0->1->2->3
G = [0, 1, 3]
輸出: 2
解釋:
鏈表中,0 和 1 是相連接的,且 G 中不包含 2,所以 [0, 1] 是 G 的一個(gè)組件,同理 [3] 也是一個(gè)組件,故返回 2。
示例 2:
輸入:
head: 0->1->2->3->4
G = [0, 3, 1, 4]
輸出: 2
解釋:
鏈表中,0 和 1 是相連接的,3 和 4 是相連接的,所以 [0, 1] 和 [3, 4] 是兩個(gè)組件,故返回 2。
解題思路:
用指針p表示當(dāng)前鏈表結(jié)點(diǎn),p一開始為head頭結(jié)點(diǎn),我們從G中挨個(gè)遍歷,如果能找到,說(shuō)明p的val在G中存在,這時(shí),把p后移一個(gè),即p=p->next,再在G(從G[0]到G[n-1])中找p的值,如果找到,同樣進(jìn)香行操作,直到在中找不到p->val為止。此時(shí),組件的個(gè)數(shù)加1。
代碼:
/**
public class SingNode {
public var value : Int
public var nextNode: SingNode?
public init(value:Int) {
self.value = value
}
}
extension SingNode : CustomStringConvertible {
public var description: String {
var string = "\(value)"
var node = self.nextNode
while node != nil {
string = string + " -- " + "\(node!.value)"
node = node?.nextNode
}
return string
}
}
**/
func numComponents(_ l1:SingNode?,_ intArr:[Int]?) -> Int {
if l1 == nil || intArr == nil {
return 0
}
var number = 0
var head = l1
var t = 0
while head != nil {
if(intArr!.contains(head!.value)) {
t += 1
if head?.nextNode == nil {
number = number + 1
}
} else {
if t > 0 {
number = number + 1
}
t = 0
}
head = head?.nextNode
}
return number
}