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

来源:互联网 发布:联系打字的软件 编辑:程序博客网 时间:2024/05/16 11:56

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

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;// 在原链表的每一个节点后面复制出一个与前一个节点相同的节点,并且插入到前一个节点后面。只处理nextsimpleCopy(head);// 处理siblingconnectSibling(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
原创粉丝点击