【剑指 Offer 学习】【面试题 26: 复杂链表的复制】【思路】

题目:

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

 

思路:

  • 根据原始链表的每个结点 N 创建对应的 N’
  • 将复制后的结点接在原结点后

原始链表:A -> B -> C -> D -> E

复制后的链表:A -> A’ -> B -> B’ -> C -> C’ -> D -> D’ -> E -> E’

  • 设置复制出来的结点的 random 指针。

如,A 的 random 指针指向 C,那么 A’ 的 random 指针指向 C’

其对应复制出来的 A’是 A 的 next 指向的结点,同样 C’也是 C 的 next 指向的结点。

  • 拆分成两个链表,取偶数位置上的结点,连接起来就是复制出来的新链表

 

代码:

package 复杂链表的复制26;

/**
 * 输入一个复杂链表(每个结点中有结点值,以及两个指针,
 * 一个指向下一个结点,另一个特殊指针指向任意一个结点),
 * 返回结果为复制后复杂链表的head。
 * (注意,输出结果中请不要返回参数中的结点引用,否则判题程序会直接返回空)
 * @author Administrator
 *
 */
class RandomListNode {
    int label;
    RandomListNode next = null;		// 指向下一个结点
    RandomListNode random = null;	// 

    RandomListNode(int label) {
        this.label = label;
    }
}

public class Demo {

	/**
	 * 1、根据原始链表的每个结点 N 创建对应的 N’
	 * 2、将复制后的结点接在原结点后
	 * 原始链表:A -> B -> C -> D -> E
	 * 复制后的链表:A -> A’ -> B -> B’ -> C -> C’ -> D -> D’ -> E -> E’
	 * 3、设置复制出来的结点的 random 指针。
	 * 如,A 的 random 指针指向 C,那么 A’ 的 random 指针指向 C’
	 * 其对应复制出来的 A’是 A 的 next 指向的结点,同样 C’也是 C 的 next 指向的结点。
	 * 4、拆分成两个链表,取偶数位置上的结点,连接起来就是复制出来的新链表
	 * 
	 * @param pHead
	 * @return
	 */
	public RandomListNode Clone(RandomListNode pHead) {
		if (pHead == null) {
			return null;
		}
		
		RandomListNode head = new RandomListNode(pHead.label);
		RandomListNode temp = head;
		
		while (pHead.next != null) {
			// 依次复制 next 结点,直到复制完毕
			temp.next = new RandomListNode(pHead.next.label);
			// 原始链表的当前结点的 random 结点不为空时,复制
			if (pHead.random != null) {
				temp.random = new RandomListNode(pHead.random.label);
			}
			pHead = pHead.next;
			temp = temp.next;
		}
		return head;
	}

	/**
     * 输出链表信息
     *
     * @param head 链表头结点
     */
    public static void printList(RandomListNode head) {
        while (head != null) {
            System.out.print(head.label + "->");
            head = head.next;
        }
        System.out.println("null");
    }
	
	public static void main(String[] args) {
		//     		-----------------
	    //         \|/              |
	    //  1-------2-------3-------4-------5
	    //  |       |      /|\             /|\
	    //  --------+--------               |
	    //          -------------------------
	    RandomListNode head = new RandomListNode(1);
	    head.next = new RandomListNode(2);
	    head.next.next = new RandomListNode(3);
	    head.next.next.next = new RandomListNode(4);
	    head.next.next.next.next = new RandomListNode(5);
	    head.random = head.next.next;
	    head.next.random = head.next.next.next.next.next;
	    head.next.next.next.random = head.next;
	    printList(head);
	}
}

 

你可能感兴趣的:(剑指Offer)