剑指offer-面试题26-复杂链表的复制

复杂链表的复制 代码实现:

package case26_CopyComplexList;

/**
 * 题目:请实现函数ListNode Clone(ListNode root),复制一个复杂链表。在复杂链表中, 每个节点除了有一个Next
 * 指针指向下一个节点外,还有一个sibling指向链表中的任意结点或者null。
 * 
 * @author WangSai
 *
 */
public class CopyComplexList {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		ComplexListNode n1 = new ComplexListNode(1);
		ComplexListNode n1_ = new ComplexListNode(1);
		ComplexListNode n2 = new ComplexListNode(2);
		ComplexListNode n2_ = new ComplexListNode(2);
		ComplexListNode n3 = new ComplexListNode(3);
		ComplexListNode n3_ = new ComplexListNode(3);
		n1.next = n1_;
		n1_.next = n2;
		n2.next = n2_;
		n2_.next = n3;
		n3.next = n3_;
		// n3_.next = n4;
		// n4.next = n4_;
		// n4.next = n5;
		// simpleCopy(n1);
		ComplexListNode node = reConnected(n1);
		// while (node != null) {
		// System.out.print(node.data + " ");
		// node = node.next;
		// }

		while (n1 != null) {
			System.out.print(n1.data + " ");
			n1 = n1.next;
		}
	}

	/**
	 * 
	 * @param head,原链表的头结点
	 * @return 复制出来的节点的头结点
	 */
	private static ComplexListNode Clone(ComplexListNode head) {
		// 异常值检测
		if (head == null)
			return null;
		// 在原链表的每一个节点后面复制出一个与前一个节点相同的节点,并且插入到前一个节点后面。只处理next
		simpleCopy(head);
		// 处理sibling
		connectSibling(head);
		// 拆分链表
		reConnected(head);
		return null;

	}

	/**
	 * 在原链表的每一节点N后面复制一个新的节点N',并且与前一个节点相同。
	 * 
	 * 复制出来的新链表newlist:N1 ——>N1' ——>N2 ——>N2' ——>N3 ——>N3' ——>N4 ——> N4'
	 * 
	 * @param head,原链表的头节点
	 */
	private static void simpleCopy(ComplexListNode head) {
		while (head != null) {
			// 新建节点
			ComplexListNode temp = new ComplexListNode();
			// 为新节点赋值,值为当前处理的head节点的值
			temp.data = head.data + 100;
			// 把新节点插入到原head的下一个节点的前面。
			temp.next = head.next;
			// 把temp插入到head后面
			head.next = temp;
			// head指向原链表的下一个节点
			head = temp.next;
		}
	}

	/**
	 * 处理复制出来的链表newlist(N1——>N1'——>N2——>N2'——>N3——>N3'——>N4——> N4')中的sibling节点。
	 * 
	 * @param head,复制出来的新链表newlist的头结点。
	 */
	private static void connectSibling(ComplexListNode head) {
		while (head != null) {
			// head.next:新链表中被复制出来的新节点
			// head.next.next:原链表中head的下一个节点
			// head.sibling:原节点的sibling节点
			// head.next.sibling:复制出来的新节点的sibling节点
			// head.sibling.next:原节点的sibling节点的下一个节点,即新节点的sibling节点
			if (head.sibling != null) {
				head.next.sibling = head.sibling.next;
			}
		}
	}

	/**
	 * 把原来的节点和复制出来的新结点进行拆分。奇数是原来的节点,偶数是复制出来的结点。
	 * 
	 * @param head,复制出来新链表newlist(N1—>N1'—>N2—>N2'—>N3—>N3'—>N4—>N4')的头结点。
	 * @return 题目要求的新节点的头结点N1',即N1' ——>N2' ——>N3' ——> N4'的头结点。
	 */
	private static ComplexListNode reConnected(ComplexListNode head) {

		// 记录偶数结点组成的链表的头结点
		ComplexListNode newHead = head.next;
		// 指向偶数结点
		ComplexListNode pointer = newHead;
		// 最原始的链表的头结点的引用
		ComplexListNode pre = head;

		while (pre != null) {
			pre.next = pre.next.next;
			if (pointer.next == null) {
				pointer.next = null;
			} else {
				pointer.next = pointer.next.next;
			}
			pre = pre.next;
			pointer = pointer.next;
		}
		return newHead;
	}
}



复杂链表节点结构的定义:

package case26_CopyComplexList;

/**
 * 复杂链表中节点结构的定义
 * 
 * @author WangSai
 *
 */
public class ComplexListNode {
	int data;
	ComplexListNode next;
	ComplexListNode sibling;

	public ComplexListNode() {
	}

	public ComplexListNode(int data) {
		this.data = data;
	}
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值