请实现 copyRandomList
函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next
指针指向下一个节点,还有一个 random
指针指向链表中的任意节点或者 null
。
示例 1:
示例 2:
输入:head = [[1,1],[2,1]] 输出:[[1,1],[2,1]]
|
示例 3:
输入:head = [[3,null],[3,0],[3,null]] 输出:[[3,null],[3,0],[3,null]]
|
示例 4:
输入:head = 输出: 解释:给定的链表为空(空指针),因此返回 null。
|
提示:
-10000 <= Node.val <= 10000
Node.random
为空(null)或指向链表中的节点。
- 节点数目不超过 1000 。
C++
class Solution { public: map<Node*, Node*> mp; Node* copyRandomList(Node* head) { if (!head) return nullptr; if (!mp.count(head)) { Node* headNew = new Node(head -> val); mp[head] = headNew; headNew -> next = copyRandomList(head -> next); headNew -> random = copyRandomList(head -> random); } return mp[head]; } };
|
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。
为了让您更好地理解问题,以下面的二叉搜索树为例:
我们希望将这个二叉搜索树转化为双向循环链表。链表中的每个节点都有一个前驱和后继指针。对于双向循环链表,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点。
下图展示了上面的二叉搜索树转化成的链表。“head” 表示指向链表中有最小元素的节点。
特别地,我们希望可以就地完成转换操作。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继。还需要返回链表中的第一个节点的指针。
C++
class Solution { public: Node* head = nullptr; Node* treeToDoublyList(Node* root) { if(!root) return nullptr; inorder(root); head -> left = tail; tail -> right = head; return head; }
Node* tail = nullptr; Node* pre = nullptr; void inorder(Node* root){ if(!root) return; inorder(root -> left);
Node* newNode = new Node(root -> val); if(!head) head = newNode; if(pre) pre -> right = newNode; newNode -> left = pre; tail = newNode; pre = newNode;
inorder(root -> right); } };
|