題目:輸入一個復雜鏈表(每個節(jié)點中有節(jié)點值印荔,以及兩個指針,一個指向下一個節(jié)點彼妻,另一個特殊指針指向任意一個節(jié)點).
核心代碼:
<pre><code>`
func randomListNodeClone(headNode:inout RandomListNode?) {
var pHead:RandomListNode? = headNode
// A->B->C 拷貝 A->A1->B->B2->C->C1
while pHead != nil {
let cloneNode:RandomListNode = RandomListNode()
cloneNode.data = (pHead?.data)! + "1"
cloneNode.next = pHead?.next
pHead?.next = cloneNode
pHead = cloneNode.next
}
// sibling 拷貝
var sHead:RandomListNode? = headNode
while sHead != nil {
let nextNode:RandomListNode? = sHead?.next
if nextNode != nil {
nextNode!.sibling = sHead?.sibling?.next
}
sHead = sHead?.next?.next
}
// 拆分鏈表
let cloneHead:RandomListNode? = headNode?.next
headNode = cloneHead
var beginNode:RandomListNode? = cloneHead
while beginNode != nil {
let temp = beginNode?.next?.next
if beginNode?.next != nil {
beginNode?.next = temp
}
beginNode = temp
}
}`</code></pre>
測試代碼:
<pre><code>`
var randomHead:RandomListNode = RandomListNode()
randomHead.data = "A"
var randomNode1:RandomListNode = RandomListNode()
randomNode1.data = "B"
randomHead.next = randomNode1
var randomNode2:RandomListNode = RandomListNode()
randomNode2.data = "C"
randomNode1.next = randomNode2
var randomNode3:RandomListNode = RandomListNode()
randomNode3.data = "D"
randomNode2.next = randomNode3
var randomNode4:RandomListNode = RandomListNode()
randomNode4.data = "E"
randomNode3.next = randomNode4
randomHead.sibling = randomNode2
randomNode1.sibling = randomNode4
randomNode3.sibling = randomNode1
var pHead:RandomListNode? = randomHead
var clone:RandomListClone = RandomListClone()
clone.randomListNodeClone(headNode: &pHead)
while pHead != nil {
print("FlyElephant-隨機節(jié)點--(pHead!.data)---??--(pHead!.sibling?.data)")
pHead = pHead?.next
}`</code></pre>