小渣渣的算法学习笔记:2018秋招备战
数据结构类算法总结:链表
数据结构类算法总结:链表
1.题目描述:
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点, 另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。
2.代码实现:
public class Solution35 { private static class ComplexListNode{ int value; ComplexListNode next; ComplexListNode sibling; public ComplexListNode(){} public ComplexListNode(int value){ this.value = value; } } public static void main(String[] args) { Solution35 s = new Solution35(); ComplexListNode c1 = new ComplexListNode(1); ComplexListNode c2 = new ComplexListNode(2); ComplexListNode c3 = new ComplexListNode(3); ComplexListNode c4 = new ComplexListNode(4); ComplexListNode c5 = new ComplexListNode(5); c1.next = c2; c1.sibling = c3; c2.next = c3; c2.sibling = c5; c3.next = c4; c4.next = c5; c4.sibling = c2; ComplexListNode c = s.clone(c1); while(c != null){ System.out.print(c.value+" "); c = c.next; } } //1.复制原始链表的任意结点N并创建新结点N',再把N'链接到N的后面 public void cloneNodes(ComplexListNode head){ ComplexListNode pnode = head; while(pnode != null){ ComplexListNode pclone = new ComplexListNode(); pclone.value = pnode.value; pclone.next = pnode.next; pclone.sibling = null; pnode.next = pclone; pnode = pclone.next; } } //2.设置复制出来的结点的sibling public void connectSiblingNodes(ComplexListNode head){ ComplexListNode pnode = head; while(pnode != null){ ComplexListNode pclone = pnode.next; if(pnode.sibling != null){ pclone.sibling = pnode.sibling.next; } pnode = pclone.next; } } //3.将长链表拆分成两个链表:奇数位置的结点用next链接起来就是原始链表 public ComplexListNode reconnectNodes(ComplexListNode head){ ComplexListNode pnode = head; ComplexListNode pcloneHead = null; ComplexListNode pcloneNode = null; if(pnode != null){ pcloneHead = pcloneNode = pnode.next; pnode.next = pcloneNode.next; pnode = pnode.next; } while(pnode != null){ pcloneNode.next = pnode.next; pcloneNode = pcloneNode.next; pnode.next = pcloneNode.next; pnode = pnode.next; } return pcloneHead; } //4.整合上面三个步骤,即复制链表的完整过程 public ComplexListNode clone(ComplexListNode head){ cloneNodes(head); connectSiblingNodes(head); return reconnectNodes(head); } }