題目:
複製一個複雜鏈表。複雜鏈表中,每個結點除了有一個指針指向下一個結點外,還有一個指針可以指向鏈表中的任意一個結點或者null。
答案:
分三步
1.根據原來的鏈表的每個結點N,創建對應的N',並將N'連接在N後面,組成一個鏈表
2.對每個N'結點設置副結點,副結點爲其前面結點N指向的副結點S,對應的next節點S’
3.拆分新舊鏈表,返回新鏈表,第一個N節點的下一個結點N'即爲新鏈表的頭結點,將N的next節點指向N'的next節點,完成拆分。
public ComplexListNode cloneComplexListNode(ComplexListNode head) {
if (head == null){
return null;
}
//1.根據原來的鏈表的每個結點N,創建對應的N',並將N'連接在N後面
cloneNode(head);
//2.設置副結點
setSibling(head);
//3.拆分新舊鏈表,返回新鏈表
return getNewListNode(head);
}
private void cloneNode(ComplexListNode head) {
ComplexListNode p = head;
while (p != null) {
ComplexListNode cloneNode = new ComplexListNode(p.value);
cloneNode.next = p.next;
p.next = cloneNode;
p = cloneNode.next;
}
}
private void setSibling(ComplexListNode head) {
ComplexListNode p = head;
while (p != null) {
ComplexListNode cloneNode = p.next;
if (p.sibling != null) {
cloneNode.sibling = p.sibling.next;
}
p = cloneNode.next;
}
}
private ComplexListNode getNewListNode(ComplexListNode head) {
ComplexListNode newHead = head.next;
ComplexListNode p = head;
while (p != null) {
ComplexListNode cloneNode = p.next;
p.next = cloneNode.next;
if (p.next != null) {
cloneNode.next = cloneNode.next.next;
p = p.next;
}
}
return newHead;
}
關鍵點:
找到N'對應的副結點
方法二:藉助空間,map保存每個舊節點N對應的新複製節點N'。
1.首先通過節點N複製N'時,先將其副結點設置爲S,並用map保存N對應的新複製節點N'的關係。
2.重新設置副結點N'時,由於原來的副結點是S,通過map就可以找到S對應的複製結點S',將N'的副結點設置爲S',完成複製。