复杂链表的复制-剑指Offer

复杂链表的复制

题目描述

输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点)。

思路

分三步(分而治之)

  1. 将链表复制下来追加到每个元素的后面,例如A->A‘->B->B‘->C->C‘...
  2. 复制每个元素的random指针
  3. 从整体的链表中间隔的取出复制出来的链表

代码

/*
public class RandomListNode {
    int label;
    RandomListNode next = null;
    RandomListNode random = null;

    RandomListNode(int label) {
        this.label = label;
    }
}
*/
public class Solution {
    public RandomListNode Clone(RandomListNode pHead)
    {
        cloneNodes(pHead);
        cloneRandom(pHead);
        return reconnectNode(pHead);
    }
    // 复制链表追加到每个元素的后面
	public void cloneNodes(RandomListNode pHead) {
		RandomListNode temp = pHead;
		while (temp != null) {
			RandomListNode newNode = new RandomListNode(temp.label);
			newNode.random = null;
			newNode.next = temp.next;

			temp.next = newNode;
			temp = newNode.next;
		}
	}
    // 复制每个元素的random指针
	public void cloneRandom(RandomListNode pHead) {
		RandomListNode temp = pHead;
		while (temp != null) {
			if (temp.random != null) {
				temp.next.random = temp.random.next;
			} else {
				temp.next.random = null;
			}
			temp = temp.next.next;
		}
	}
    // 从整个链表中抽离出来我们复制的链表
	public RandomListNode reconnectNode(RandomListNode pHead) {
		RandomListNode pNode = pHead;
		RandomListNode newHead = null;
		RandomListNode newNode = null;
		if (pNode != null) {
			newHead = pNode.next;
			newNode = newHead;
			pNode.next = newNode.next;
			pNode = pNode.next;
		}
		while (pNode != null) {
			newNode.next = pNode.next;
			newNode = newNode.next;
			pNode.next = newNode.next;
			pNode = pNode.next;
		}
		return newHead;
	}
}
时间: 2024-11-17 23:30:14

复杂链表的复制-剑指Offer的相关文章

C++s合并两个链表(牛客剑指offer)

/////这段代码不忍直视,想不通这样在牛客剑指offer上都可以通过.. #include <iostream> using namespace std; struct ListNode { int val; struct ListNode *next; ListNode(int x):val(x),next(NULL){} }; void show(ListNode *root); class Solution { public: ListNode* Merge(ListNode* pHe

《剑指offer》题解

有段时间准备找工作,囫囵吞枣地做了<剑指offer>提供的编程习题,下面是题解收集. 当初没写目录真是个坏习惯(-_-)||,自己写的东西都要到处找. 剑指Offer - 九度1524 - 复杂链表的复制 剑指Offer - 九度1509 - 树中两个结点的最低公共祖先 剑指Offer - 九度1508 - 把字符串转换成整数 剑指Offer - 九度1504 - 把数组排成最小的数 剑指Offer - 九度1503 - 二叉搜索树与双向链表 剑指Offer - 九度1390 - 矩形覆盖 剑

【剑指Offer学习】【所有面试题汇总】

剑指Offer学习 剑指Offer这本书已经学习完了,从中也学习到了不少的东西,现在做一个总的目录,供自已和大家一起参考,学如逆水行舟,不进则退.只有不断地学习才能跟上时候,跟得上技术的潮流! 所有代码下载[https://github.com/Wang-Jun-Chao/coding-interviews] 目录 第01-10题 [剑指Offer学习][面试题02:实现Singleton 模式--七种实现方式] [剑指Offer学习][面试题03:二维数组中的查找] [剑指Offer学习][面

【剑指offer】复杂链表的复制

转载请注明出处:http://blog.csdn.net/ns_code/article/details/26154691 题目描述: 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点). 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一行为一个整数n (1<=n<=1000):n代表将要输入的链表元素的个数.(节点编号从1开始).接下来有n个数,表示链表节点中的值.接下来有n个数Ti,Ti表示第i个节点的另

剑指offer之【复杂链表的复制】

题目: 复杂链表的复制 链接: https://www.nowcoder.com/practice/f836b2c43afc4b35ad6adc41ec941dba?tpId=13&tqId=11178&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking 题目描述: 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为

剑指offer (27) 复杂链表的复制

题目:请实现一个函数,复制一个复杂链表,在复杂链表中,每个结点除了有一个m_pNext指针指向下一个结点,还有一个m_pSibling指向链表中的任意节点或者NULL struct ComplexListNode { int m_nValue; ComplexListNode* m_pNext; ComplexListNode* m_pSibling; }; 方法一: step1. 复制原始链表的每一个节点,并用m_pNext链接起来 step2. 设置每个结点的m_pSibling指针 由于m

【Java】 剑指offer(35) 复杂链表的复制

本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 请实现函数ComplexListNode* Clone(ComplexListNode* pHead),复制一个复杂链表.在复杂链表中,每个结点除了有一个m_pNext指针指向下一个点外,还有一个m_pSibling 指向链表中的任意结点或者nullptr. 思路 思路1:先复制结点,用next链接,最后根据原始结点的sibling指针确定该sibling结点距离头结点的位

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

题目描述 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空) 解题思路 package jianzhioffer.linkedlist; import com.sun.org.apache.xalan.internal.xsltc.dom.ClonedNodeListIterator; /** * @author hadoop */

剑指offer题目系列三(链表相关题目)

本篇延续上一篇剑指offer题目系列二,介绍<剑指offer>第二版中的四个题目:O(1)时间内删除链表结点.链表中倒数第k个结点.反转链表.合并两个排序的链表.同样,这些题目并非严格按照书中的顺序展示的,而是按自己学习的顺序,每个题目包含了分析和代码. 9.O(1)时间内删除链表结点 题目: 在O(1)时间内删除链表结点.给定单链表的头指针和一个结点指针,定义一个方法在O(1)时间内删除该结点. 单链表的定义如下: 解答: 单向链表删除一个结点,最直观的想法是从链表的头结点开始顺序遍历查找要