第25题——复杂链表的复制

114 阅读1分钟

题目:

输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)

思路:

1.遍历整个链表,复制每个节点,比如复制A节点得到A’,并把A’链接到A的后面
2.再次遍历链表,复制老节点的随机指针给新节点,如A’.random = A.random.next
3.拆分整链表,拆分成原链表和新链表

Java

package nowcoder;

class RandomListNode{
    int label;
    RandomListNode next = null;
    RandomListNode random = null;
    RandomListNode(int label){
        this.label = label;
    }
}

public class S25_Clone {
    public RandomListNode Clone(RandomListNode pHead){
        if (pHead == null) return null;
        RandomListNode temp = pHead;
        //1.遍历整个链表,复制每个节点,比如复制A节点得到A’,并把A’链接到A的后面
        while (temp != null){
            RandomListNode node = new RandomListNode(temp.label);
            node.next = temp.next;
            temp.next = node;
            temp = node.next;
        }
        //2.再次遍历链表,复制老节点的随机指针给新节点,如A’.random = A.random.next
        temp = pHead;
        RandomListNode head = pHead.next;
        while (temp != null){
            if (temp.random != null)
                temp.next.random = temp.random.next;
            temp = temp.next.next;
        }
        //3.拆分整链表,拆分成原链表和新链表
        temp = pHead;
        RandomListNode temp1 = temp.next;
        while (temp != null){
            temp.next = temp1.next;
            if (temp.next != null)
                temp1.next = temp.next.next;
            temp = temp.next;
            temp1 = temp1.next;
        }
        return head;
    }
}

Python

class RandomListNode:
    def __init__(self, x):
        self.next = None
        self.random = None
        self.label = x
class Clone:
    def Clone(self, pHead):
        if not pHead:
            return None
        temp = pHead
        while temp:
            node = RandomListNode(temp.label)
            node.next = temp.next
            temp.next = node
            temp = node.next
        temp = pHead
        head = pHead.next
        while temp:
            if temp.next:
                temp.next.random = temp.random.next
            temp = temp.next.next
        #拆分
        temp1 = temp.next
        while temp:
            temp.next = temp1.next
            if temp.next:
                temp1.next = temp.next
            temp = temp.next
            temp1 = temp1.next
        return head