剑指offer_链表---复杂链表的复制

简介: 剑指offer_链表---复杂链表的复制

##题目描述

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

##解题思路

第一步,原样复制,每一个复制的节点跟在原节点后边

第二步,确定复制节点的任意指向

第三步,拆分长链表为原链表和复制链表

##代码实现

/**
 * 
 */
package 链表;
/**
 * <p>
 * Title:RandomListNodeClone
 * </p>
 * <p>
 * Description:
 * </p>
 * 
 * @author 田茂林
 * @data 2017年8月22日 下午4:06:59
 */
class RandomListNode {
  int label;
  RandomListNode next = null;
  RandomListNode random = null;
  RandomListNode(int label) {
    this.label = label;
  }
}
public class RandomListNodeClone {
  public RandomListNode Clone(RandomListNode pHead) {
    if(pHead==null){
      return null;
    }
         //第一步,原样复制,每一个复制的节点跟在原节点后边
    RandomListNode p = pHead;
    while(p!=null){
      RandomListNode clone = new RandomListNode(p.label);
      clone.next = p.next;  //先把后边接上
      p.next = clone;//接全了
      p = clone.next;  //指针移位到下一个旧节点
    }
    p = pHead;
    //第二步,确定复制节点的任意指向
    while(p!=null){
      if(p.random!=null){
        p.next.random = p.random.next;   //复制节点的任意指向就是原节点任意指向的下一个。
      }
      p=p.next.next;//p移动到下一个旧节点。
    }
    //第三步,拆分长链表为原链表和复制链表
    RandomListNode head = pHead.next;
    RandomListNode cur = head;
    p = pHead;
    while(p!=null){
      p.next = p.next.next;
      if(cur.next!=null){
        cur.next = cur.next.next;
      }
      p = p.next;
      cur=cur.next;
    }
    return head;
  }
}


相关文章
|
6月前
《剑指offer》——合并两个排序的链表
《剑指offer》——合并两个排序的链表
|
1月前
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
46 0
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 22. 链表中倒数第k个节点
Leetcode题目"剑指 Offer 22. 链表中倒数第k个节点"的Python解决方案,使用双指针法找到并返回链表中倒数第k个节点。
52 5
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 18. 删除链表的节点
Leetcode题目"剑指 Offer 18. 删除链表的节点"的Python解决方案,通过使用双指针法找到并删除链表中值为特定数值的节点,然后返回更新后的链表头节点。
41 4
|
6月前
|
Java C语言
剑指offer(牛客)——合并两个排序的链表
剑指offer(牛客)——合并两个排序的链表
39 1
|
6月前
|
存储 Java C语言
剑指offer(牛客)——从尾到头打印链表
剑指offer(牛客)——从尾到头打印链表
41 1
|
6月前
【一刷《剑指Offer》】面试题 17:合并两个排序的链表
【一刷《剑指Offer》】面试题 17:合并两个排序的链表
|
6月前
【一刷《剑指Offer》】面试题 16:反转链表
【一刷《剑指Offer》】面试题 16:反转链表
|
6月前
【一刷《剑指Offer》】面试题 15:链表中倒数第 k 个结点
【一刷《剑指Offer》】面试题 15:链表中倒数第 k 个结点
|
6月前
|
机器学习/深度学习
【一刷《剑指Offer》】面试题 13:在 O(1) 时间删除链表结点
【一刷《剑指Offer》】面试题 13:在 O(1) 时间删除链表结点