关闭

【Leetcode】Copy List with Random Pointer

176人阅读 评论(0) 收藏 举报
分类:

题目链接:https://leetcode.com/problems/copy-list-with-random-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.

思路:

先拷贝原链表值,然后找到原链表每个结点的随机指针在链表中的位置,找到拷贝链表的随机指针的指向。

算法:

	public RandomListNode copyRandomList(RandomListNode head) {
		// head2表示拷贝链表表头,t指向拷贝链表最后一个结点
		RandomListNode p = head, head2 = null, q = null, t = head2;
		// ====建立链表值的拷贝链表
		while (p != null) {
			q = new RandomListNode(p.label);
			if (head2 == null) {
				head2 = q;
				t = head2;
			} else {
				t.next = q;
				t = t.next;
			}
			p = p.next;
		}
		// ====建立拷贝链表的随机指针的指向
		p = head;
		RandomListNode pp = head2, target, tmp;
		while (p != null) {
			q = head2; // q指向拷贝链表
			tmp = head;// tmp指向原链表
			target = p.random; // target是原链表的p结点的随机指针
			if (target == null) {
				pp.random = null;
			} else {
				// 在原链表上,从头开始查找和随机指针相等的结点,找到后因为拷贝指针位移和原指针相等,所以此时q指向的就是拷贝链表结点的随机指针的结点
				while (tmp != null) {
					if (tmp == target) {
						pp.random = q;// 找到随机指针指向的结点时,q指向的就是拷贝链表的random point
						break;
					} else {
						tmp = tmp.next;// 原链表和拷贝链表指针同时移动一步
						q = q.next;
					}
				}
			}
			p = p.next; // 原和拷贝链表保持相同位移
			pp = pp.next;
		}

		return head2;
	}


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:527939次
    • 积分:8194
    • 等级:
    • 排名:第2537名
    • 原创:305篇
    • 转载:6篇
    • 译文:0篇
    • 评论:34条
    博客专栏
    文章分类
    最新评论