剑指offer 25. 分解让复杂问题简单 复杂链表的复制

题目描述

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

解题思路



package jianzhioffer.linkedlist;

import com.sun.org.apache.xalan.internal.xsltc.dom.ClonedNodeListIterator;

/**

* @author hadoop
*/

/*
*解题思路:
*1、遍历链表,复制每个结点,如复制结点A得到A1,将结点A1插到结点A后面;
*2、重新遍历链表,复制老结点的随机指针给新结点,如A1.random = A.random.next;
*3、拆分链表,将链表拆分为原链表和复制后的链表
*/
public class Clone {

public RandomListNode Clone(RandomListNode pHead) {
if(pHead == null) {
return null;
}

RandomListNode currentNode = pHead;
//1、复制每个结点,如复制结点A得到A1,将结点A1插到结点A后面;
while(currentNode != null){
RandomListNode cloneNode = new RandomListNode(currentNode.label);
RandomListNode nextNode = currentNode.next;
currentNode.next = cloneNode;
cloneNode.next = nextNode;
currentNode = nextNode;
}

currentNode = pHead;
//2、重新遍历链表,复制老结点的随机指针给新结点,如A1.random = A.random.next;
while(currentNode != null) {
currentNode.next.random = currentNode.random==null?null:currentNode.random.next;
currentNode = currentNode.next.next;
}

//3、拆分链表,将链表拆分为原链表和复制后的链表
currentNode = pHead;
RandomListNode pCloneHead = pHead.next;
while(currentNode != null) {
RandomListNode cloneNode = currentNode.next;
currentNode.next = cloneNode.next;
cloneNode.next = cloneNode.next==null?null:cloneNode.next.next;
currentNode = currentNode.next;
}

return pCloneHead;
}

class RandomListNode {
int label;
RandomListNode next = null;
RandomListNode random = null;

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

}



剑指offer 25. 分解让复杂问题简单 复杂链表的复制

原文地址:https://www.cnblogs.com/Transkai/p/10969730.html

时间: 2024-08-03 21:15:27

剑指offer 25. 分解让复杂问题简单 复杂链表的复制的相关文章

【剑指offer】递归循环两种方式反转链表

转载请注明出处:http://blog.csdn.net/ns_code/article/details/25737023 本文分别用非递归和递归两种方式实现了链表的反转,在九度OJ上AC. 题目描述: 输入一个链表,反转链表后,输出链表的所有元素.(hint : 请务必使用链表) 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一行为一个整数n(0<=n<=1000):代表将要输入的链表的个数.输入的第二行包含n个整数t(0<=t<=1000000)

【剑指offer】Q5:从尾到头打印链表

可以练习下链表的逆置. def PrintListReversingly(head): if head == None: return if head: PrintListReversingly(head.next) print head.val def reverse(head): if head == None or head.next == None: return head psuhead = ListNode(-1) while head: nexthead = head.next h

【剑指offer】Q17:合并两个排序的链表

def Merge(head1, head2): if head1 == None: return head2 if head2 == None: return head1 psuhead = ListNode(-1) tail = psuhead while head1 and head2: if head1.val < head2.val: cur = head1 head1 = head1.next else: cur = head2 head2 = head2.next cur.next

剑指offer(十六) 合并两个排序的链表

合并两个排序的链表 题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 用JavaScript非递归和递归方式都AC了. 非递归: function ListNode(x){ this.val = x; this.next = null; } function Merge(pHead1, pHead2) { if(!pHead1) { return !pHead2 ? null:pHead2; }else if(!pHead2) { retur

剑指Offer对答如流系列 - 合并两个排序的链表

面试题25:合并两个排序的链表 题目描述 输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的. 链表结构: public class ListNode { int val; ListNode next=null; ListNode(int val){ this.val=val; } } 问题分析 这道面试题,太常见了!!! 不难,但是容易出错.一方面是合并过程链表中间断裂或者没有做到递增,另一方面是代码的鲁棒性不行,也就是忽略了特殊测试(比如任意一个或者两个链表的头结点

[剑指offer] 25. 复杂链表的复制

题目描述 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空) 思路: 因为新链表也需要复制旧链表的random指针,而random指向的节点也有其next和random,需要保持链表的连贯,所以需要考虑先做出一条新链表,再去构建每一个节点的random节点,而如何同步random节点就是问题所在.有两种解决办法. 解法一:构建同一链表

剑指Offer 25

1 # -*- coding:utf-8 -*- 2 # class ListNode: 3 # def __init__(self, x): 4 # self.val = x 5 # self.next = None 6 class Solution: 7 # 返回合并后列表 8 def Merge(self, pHead1, pHead2): 9 if pHead1 == None: 10 return pHead2 11 if pHead2 == None: 12 return pHead

【剑指offer】替换空格从尾到头打印链表

题目链接 [题目描述] 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList. [解题思路] 将链表的元素压入栈中(因为栈是先进后出的),然后再把栈中的元素放入vector即实现了倒序. [代码] 1 /** 2 * struct ListNode { 3 * int val; 4 * struct ListNode *next; 5 * ListNode(int x) : 6 * val(x), next(NULL) { 7 * } 8 * }; 9 */ 10 class Solu

剑指offer第三题 从尾到头打印链表

输入一个链表,按链表从尾到头的顺序返回一个ArrayList. 解题思路:先入栈相当于链表逆序再出栈实现链表从尾到头的顺序输出. 1 /** 2 * public class ListNode { 3 * int val; 4 * ListNode next = null; 5 * 6 * ListNode(int val) { 7 * this.val = val; 8 * } 9 * } 10 * 11 */ 12 import java.util.*; 13 public class So