复杂链表的复制

来源:互联网 发布:词频统计软件 编辑:程序博客网 时间:2024/06/05 03:46
package com.google.android;/** * 复杂链表的复制 * @author Administrator * */public class ComplexList {public static void main(String[] args) {ComplexListNode pHead = create();ComplexListNode pClone = clone(pHead);print(pClone);}/** * 复制复杂链表 * @param pHead * @return */private static ComplexListNode clone(ComplexListNode pHead) {ComplexListNode pHeadLocal = duplicateList(pHead);pHeadLocal = connectSlideNode(pHeadLocal);ComplexListNode pClonedHead = splitList(pHeadLocal);return pClonedHead;}/** * 拆分复制过的链表 * @param pHead * @return */private static ComplexListNode splitList(ComplexListNode pHead) {ComplexListNode pNode = pHead;ComplexListNode pCopy = null;ComplexListNode pClonedHead = null;if (pNode != null) {pClonedHead = pNode.pNext;}while (pNode != null) {pCopy = pNode.pNext;pNode.pNext = pCopy.pNext;pNode = pCopy.pNext;if (pNode != null) {pCopy.pNext = pNode.pNext;} else {pCopy.pNext = null;}}return pClonedHead;}/** * 连接链表中的滑动节点指针 * @param pHead * @return */private static ComplexListNode connectSlideNode(ComplexListNode pHead) {ComplexListNode pNode = pHead;ComplexListNode pCopy = null;while (pNode != null) {pCopy = pNode.pNext;if (pNode.slideNode != null) {// 关键在于复制的滑动节点总是在原来节点的后面pCopy.slideNode = pNode.slideNode.pNext;}pNode = pCopy.pNext;}return pHead;}/** * 把原来的链表每个节点复制一份挂到原节点后面 * @param pHead * @return */private static ComplexListNode duplicateList(ComplexListNode pHead) {ComplexListNode pNode = pHead;while (pNode != null) {ComplexListNode copy = new ComplexListNode();copy.val = pNode.val;copy.slideNode = pNode.slideNode;// 插入复制的节点copy.pNext = pNode.pNext;pNode.pNext = copy;pNode = copy.pNext;}return pHead;}/** * 产生复杂链表 * @return */private static ComplexListNode create() {ComplexListNode pHead = null;pHead = new ComplexListNode();pHead.val = 1;pHead.pNext = null;pHead.slideNode = null;for (int i = 2; i < 10; i++) {ComplexListNode node = new ComplexListNode();node.val = i;node.pNext = pHead;node.slideNode = null;pHead = node;}pHead.slideNode = pHead.pNext.pNext.pNext;// 9->6pHead.pNext.slideNode = pHead.pNext.pNext.pNext.pNext.pNext;// 8->4pHead.pNext.pNext.slideNode = pHead.pNext.pNext;// 7->7pHead.pNext.pNext.pNext.slideNode = pHead;// 6->9pHead.pNext.pNext.pNext.pNext.pNext.pNext.slideNode = pHead.pNext.pNext;// 3->7return pHead;}private static void print(ComplexListNode pHead) {ComplexListNode pNode = pHead;while (pNode != null) {System.out.print(pNode.val + "\t");pNode = pNode.pNext;}System.out.println();pNode = pHead;while (pNode != null) {if (pNode.slideNode != null) {System.out.print(pNode.val + "->" + pNode.slideNode.val + "\t");}pNode = pNode.pNext;}System.out.println();}}/** * 复杂链表节点 *  * @author Administrator * */class ComplexListNode {int val;ComplexListNode pNext;/** * 指向链表中任意节点 */ComplexListNode slideNode;}

0 0
原创粉丝点击