public static Node copyListWithRand2(Node head){
// 如果头节点为空,直接返回null
if(head == null){
return null;
}
// 初始化当前节点和下一个节点
Node cur = head;
Node next = null;
// 遍历链表,复制每个节点,并将新节点插入原节点后面
while (cur != null){
next = cur.next; // 保存当前节点的下一个节点
cur.next =new Node(cur.value); // 创建新节点并插入到当前节点后面
cur.next.next = next; // 将新节点的下一个节点指向原节点的下一个节点
cur = next; // 移动到下一个节点
}
// 重新设置当前节点为头节点
cur = head;
Node curCopy = null;
// 再次遍历链表,处理随机指针
while (cur != null){
next = cur.next.next; // 获取当前节点复制后的下一个节点
curCopy = cur.next; // 获取当前节点的复制节点
curCopy.rand = cur.rand != null ? cur.rand.next :null; // 设置复制节点的随机指针
cur =next; // 移动到下一个节点
}
// 分离复制链表和原链表
Node res = head.next; // 复制链表的头节点
cur = head;
// 遍历链表,恢复原链表的结构
while (cur != null){
next = cur.next.next; // 获取当前节点复制后的下一个节点
curCopy = cur.next; // 获取当前节点的复制节点
cur.next = next; // 恢复原链表的结构
curCopy.next = next != null ? next.next :null; // 恢复复制链表的结构
cur = next; // 移动到下一个节点
}
return res; // 返回复制链表的头节点
}