首页 > 其他分享 >138. Copy List with Random Pointer

138. Copy List with Random Pointer

时间:2023-12-15 19:32:44浏览次数:29  
标签:Node head null cur List Next 链表 138 Pointer

题目

A linked list is given such that each node contains an additional random pointer which could point to any node in the list or null.

Return a deep copy of the list.

The Linked List is represented in the input/output as a list of n nodes. Each node is represented as a pair of [val, random_index] where:

  • val: an integer representing Node.val
  • random_index: the index of the node (range from 0 to n-1) where random pointer points to, or null if it does not point to any node.

Example 1:

Input: head = [[7,null],[13,0],[11,4],[10,2],[1,0]]
Output: [[7,null],[13,0],[11,4],[10,2],[1,0]]

Example 2:

Input: head = [[1,1],[2,1]]
Output: [[1,1],[2,1]]

Example 3:

Input: head = [[3,null],[3,0],[3,null]]
Output: [[3,null],[3,0],[3,null]]

Example 4:

Input: head = []
Output: []
Explanation: Given linked list is empty (null pointer), so return null.

Constraints:

  • 10000 <= Node.val <= 10000
  • Node.random is null or pointing to a node in the linked list.
  • The number of nodes will not exceed 1000.

题目大意

给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。要求返回这个链表的 深拷贝。

我们用一个由 n 个节点组成的链表来表示输入/输出中的链表。每个节点用一个 [val, random_index] 表示:

  • val:一个表示 Node.val 的整数。
  • random_index:随机指针指向的节点索引(范围从 0 到 n-1);如果不指向任何节点,则为  null 。

解题思路

  • 这道题严格意义上是数据结构题,根据给定的数据结构,对它进行深拷贝。

  • 先将每个节点都复制一份,放在它的 next 节点中。如此穿插的复制一份链表。

    /i/li/?n=2&i=images/blog/202312/15190109_657c31f5961ee76245.png?,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

    再将穿插版的链表的 random 指针指向正确的位置。

    /i/li/?n=2&i=images/blog/202312/15190109_657c31f5d5eb583347.png?,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

    再将穿插版的链表的 next 指针指向正确的位置。最后分开这交织在一起的两个链表的头节点,即可分开 2 个链表。

    /i/li/?n=2&i=images/blog/202312/15190109_657c31f5c772622143.png?,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

代码

package leetcode

// Node define
type Node struct {
	Val    int
	Next   *Node
	Random *Node
}

func copyRandomList(head *Node) *Node {
	if head == nil {
		return nil
	}
	tempHead := copyNodeToLinkedList(head)
	return splitLinkedList(tempHead)
}

func splitLinkedList(head *Node) *Node {
	cur := head
	head = head.Next
	for cur != nil && cur.Next != nil {
		cur.Next, cur = cur.Next.Next, cur.Next
	}
	return head
}

func copyNodeToLinkedList(head *Node) *Node {
	cur := head
	for cur != nil {
		node := &Node{
			Val:  cur.Val,
			Next: cur.Next,
		}
		cur.Next, cur = node, cur.Next
	}
	cur = head
	for cur != nil {
		if cur.Random != nil {
			cur.Next.Random = cur.Random.Next
		}
		cur = cur.Next.Next
	}
	return head
}

标签:Node,head,null,cur,List,Next,链表,138,Pointer
From: https://blog.51cto.com/u_16110811/8843975

相关文章

  • docker安装aira2 pro与ariang以及alist推送下载的配置
    Docker一键安装aira2-pro:dockerrun-d--namearia2--restartunless-stopped--log-optmax-size=1m-ePUID=$UID-ePGID=$GID-eUMASK_SET=022-eRPC_SECRET=12345678-eRPC_PORT=6800-eLISTEN_PORT=6888-p16800:6800-p16888:6888-p16888:6888/udp-v/mnt/c/......
  • 对象的数据处理方法,要对对象属性进行数组操作(list数组中每一项与column数组中的valu
       //需要对对象属性进行数组操作时,使用Object.entries()方法    varlist=['V11046_052','V11046_051','V11046_50','V11046_0511'];    varcolumn=[{'观测时间':'D_DATETIME'},{'小时内极大风速出现时间':'V......
  • Redis数据结构5:REDIS_SKIPLIST
    REDIS_SKIPLISTskipList,即:跳表,或者叫跳跃表。skiplist的优势是能支持平均O(logN)复杂度的节点查找。用一句话来说:skiplist就是一个有着索引的list。编码结构简单理解简单来说,skipList有多层“索引”以加快查找速度:其中L1、L2和L3都是一个list。当查找8时,从L3查找到5,再从L......
  • 把List变为map,并遇到重复值时自动过滤、并返回有序map
    Student:@Data@AllArgsConstructorpublicclassStudent{privateStringname;privateIntegerage;privateIntegerscore;}把list转成mapList<Student>students=List.of(newStudent(&q......
  • 1387. 将整数按权重排序(递归 +记忆化+排序)
    Problem:1387.将整数按权重排序我们将整数x的权重定义为按照下述规则将x变成1所需要的步数:如果x是偶数,那么x=x/2如果x是奇数,那么x=3*x+1比方说,x=3的权重为7。因为3需要7步变成1(3-->10-->5-->16-->8-->4-->2-->1)。给你三个整数......
  • CF1385 E
    我们发现好像和拓扑序有关我们做拓扑序的时候要是一个点没有有向边出去或者进来我们好像可以随意钦定该点其他无向边要是有有向边入和有向边出那么肯定寄有一种就直接钦定为该点其他有向边的方向就可以了其实具体实现的时候我们可以直接有向边拓扑序之后无向边钦定......
  • Redis数据结构4:REDIS_ZIPLIST
    REDIS_ZIPLISTzipList(压缩列表)是一种紧凑型的数据结构,占用一片连续的内存,本质上是一个字节数组。能提高CPU缓存的利用效率,并且针对不同数据结构进行不同编码,节省内存开销。编码结构zipList的字节数组主要由5个部分组成:zlbytes、zltail、zllen、zltail和entry。zlbytes记录......
  • A fast and simple algorithm for training neural probabilistic language models
    目录概NoisecontrastiveestimationMnihA.andTehY.W.Afastandsimplealgorithmfortrainingneuralprobabilisticlanguagemodels.ICML,2012.概NCE用在语言模型的训练上.Noisecontrastiveestimation给定context\(h\),下一个词为\(w\)的条件概率按......
  • CF1388D
    最开始以为有环发现没环之后发现是有负数的把第三个样例画出来发现疑似是拓扑序之后要是该点为正肯定放前面否则放后面但是发现好像有些点为负数的可以通过+变回正的也要放前面那我们贪心跑一遍即可voidsolve(){intn;cin>>n;vector<int>a(n+1),b(n+1),deg(n......
  • 【一个队列实现栈】Java队列——Queue接口-LinkedList实现类
    leetcode225.用队列实现栈题意:用一个队列实现栈题解:(1)弹栈:将队头开始的前size()-1个元素全部出队然后重新入队,使队尾元素循环到队头,然后弹出(2)获取栈顶元素:先将队头开始的前size()-1个元素全部出队然后重新入队,使队尾元素循环到队头,此时队头元素即为栈顶元素;然后再重新循环siz......