java实现输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head
2017-05-19 17:08
1276 查看
/** * 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意, * 输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)。 第一步:根据原始链表的每个结点N创建对应的结点N' * 第二步:设置复制出来结点的random.假设原始结点的随机指向S,复制出来结点的random指向S后一个 * 第三步:把这个长链表拆分成两个链表,奇数位置连接起来就是原始链表,偶数结点连接起来就是复制结点 */ // 复杂链表 class RandomListNode { int label; RandomListNode next = null; RandomListNode random = null; RandomListNode(int label) { this.label = label; } } public class Solution_copylianbiao { public RandomListNode Clone(RandomListNode pHead) { CloneNodes(pHead); ConnectRandomNodes(pHead); return ReConnectNodes(pHead); } // 第一步:根据原始链表的每个结点N创建对应的结点N' private void CloneNodes(RandomListNode pHead) { RandomListNode node = pHead; while (node != null) { RandomListNode cloneNode = new RandomListNode(node.label); cloneNode.next = node.next; cloneNode.random = null; node.next = cloneNode; node = cloneNode.next; } } // 第二步:设置复制出来结点的random.假设原始结点的随机指向S,复制出来结点的random指向S后一个 private void ConnectRandomNodes(RandomListNode pHead) { RandomListNode node = pHead; while (node != null) { RandomListNode clone = node.next; if (node.random != null) { clone.random = node.random.next; } node = clone.next; } } // 第三步:把这个长链表拆分成两个链表,奇数位置连接起来就是原始链表,偶数结点连接起来就是复制结点 private RandomListNode ReConnectNodes(RandomListNode pHead) { RandomListNode node = pHead; RandomListNode cloneHead = null; RandomListNode cloneNode = null; // 设置第一个节点 if (node != null) { cloneHead = node.next; cloneNode = node.next; node.next = cloneNode.next; node = node.next; } while (node != null) { cloneNode.next = node.next; cloneNode = cloneNode.next; node.next = cloneNode.next; node = node.next; } return cloneHead; } public static void main(String[] args) { RandomListNode head = new RandomListNode(1); RandomListNode node2 = new RandomListNode(2); RandomListNode node3 = new RandomListNode(3); RandomListNode node4 = new RandomListNode(4); RandomListNode node5 = new RandomListNode(5); head.next = node2; node2.next = node3; node3.next = node4; node4.next = node5; head.random = node3; node2.random = node5; node4.random = node2; Solution_copylianbiao s = new Solution_copylianbiao(); RandomListNode copyList = s.Clone(head); while (copyList != null) { System.out.print(copyList.label + " "); copyList = copyList.next; } } }
相关文章推荐
- 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head
- 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序
- 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
- 21.输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判
- 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序
- 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。
- 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序
- 一个链表的每个节点,有一个指向next指针指向下一个节点,还有一个rand指针指向这个链表中的一个随机节点或NULL,现在要求复制一个单链表来实现这个链表,返回复制后的新链表。
- 有一个特殊的链表,其中每个节点不但有指向下一个节点的指针pNext,还有一个指向链表中任意节点的指针pRand,如何拷贝这个特殊链表?
- 给定一个链表,链表的每一个节点包含三个属性:1、节点值;2、指向下一个结点的引用;3、随机指向链表内任意一个节点的引用,也能不指向任何节点。复制该链表
- 今天开始学Java 输入一个单向链表和一个节点的值,从单向链表中删除等于该值的节点,删除后如果链表中无节点则返回空指针。
- 写一个函数,输入一个二叉树,树中每个节点存放了一个整数值,函数返回这棵二叉树中相差最大的两个节点间的差值绝对值。请注意程序效率。
- java 剑指offer 第三题:输入一个链表,从尾到头打印链表每个节点的值。
- Java实现 双链表互换任意两个节点
- 给出两个表示两个非负整数的非空链表。数字以相反的顺序存储,它们的每个节点都包含一个数字。添加两个数字,并将其作为链接列表返回。
- [阿里巴巴2015校园招聘]写一个函数,输入一个二叉树,树中每个节点存放了一个整数值,函数返回这棵二叉树中相差最大的两个节点间的差值绝对值。请注意程序效率。 .
- 对于一颗完全二叉树,要求给所有节点加上一个pNext指针,指向同一层的相邻节点;如果当前节点已经是该层的最后一个节点,则将pNext指针指向NULL;给出程序实现,并分析时间复杂度和空间复杂度。
- java 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
- 使用LINUX C实现一个链表,要求:链表节点构成:姓名、分数、下一个节点指针...
- 输入一组整型元素序列,使用尾插法建立一个带有头结点的单链表。 ② 实现该线性表的遍历。 ③ 在该单链表的第i个元素前插入一个整数。 ④ 删除该单链表中的第i个元素,其值通过参数将其返回。 ⑤ 建立两个