35. 复杂链表的复制
题目
复杂链表定义如下,除了有个next指针指向下一个节点之外,还有一个sibling指针指向链表中的任意节点或者nullptr,需要实现一个Clone函数赋值一个复杂链表:
type ComplexListNode struct {
val int
next *ComplexListNode
sibling *ComplexListNode
}
解题思路
方法一:以空间换时间,用一个map保存原节点和新节点之间的映射关系<N, N'>,如果某个节点在原链表中指向S,那么在新链表中就应该指向S'。
方法二:先复制每个节点,然后把节点N'拼在N的后面,然后重新设置sibling指针,最后再拆分链表。
实现代码
方法一:
// Clone 以空间换时间,保存<N, N'>的映射关系
func Clone(head *ComplexListNode) *ComplexListNode {
if head == nil {
return nil
}
m := make(map[*ComplexListNode]*ComplexListNode)
p := head
for p != nil {
m[p] = &ComplexListNode{val: p.val}
p = p.next
}
p = head
for p != nil {
m[p].next = m[p.next]
m[p].sibling = m[p.sibling]
p = p.next
}
return m[head]
}
方法二:
// CloneV2 先复制链表,然后原地保存,再赋值兄弟指针,最后拆分链表
func CloneV2(head *ComplexListNode) *ComplexListNode {
if head == nil {
return nil
}
// 拷贝原有节点,并串联到链表中
cur := head
for cur != nil {
next := cur.next
newP := &ComplexListNode{val: cur.val}
cur.next = newP
newP.next = next
cur = next
}
// 赋值sibling
cur = head
for cur != nil {
if cur.sibling != nil {
cur.next.sibling = cur.sibling.next
}
cur = cur.next.next
}
// 拆分新老链表
newHead := head.next
cur = head
clonedCur := cur.next
for cur.next.next != nil {
cur.next = cur.next.next
clonedCur.next = cur.next.next
cur = cur.next
clonedCur = clonedCur.next
}
cur.next = nil
return newHead
}
Last updated
Was this helpful?