この記事では主に Java のインタビューの質問を紹介します。複雑なリンク リストを実装するためのコピー コードを共有することは、非常に優れており、必要な友人が学ぶことができると考えています。
Alibaba のオンライン プログラミングの最後の質問、書き留めてみんなと共有してください
一方向のリンク リストがあり、各ノードにはこのリンク リスト内のノードまたは空のノードを指すランダム ポインタが含まれており、ディープ コピー関数を作成します, ランダム ポインターを含むリンク リスト全体をコピーします。可能な限り例外を考慮してください。
アルゴリズムは次のとおりです:
/* public class RandomListNode { int label; RandomListNode next = null; RandomListNode random = null; RandomListNode(int label) { this.label = label; } } */ public class Solution { public RandomListNode Clone(RandomListNode pHead) { copyNodes(pHead); setClonedNodes(pHead); return splitNodes(pHead); } //第一步,复制链表任意结点N并创建新结点N‘,再把N'链接到N的后面 public static void copyNodes(RandomListNode head){ RandomListNode temp = head; while(temp!=null){ RandomListNode clonedNode = new RandomListNode(0); clonedNode.next = temp.next; clonedNode.label = temp.label; clonedNode.random = null; temp.next = clonedNode; temp = clonedNode.next; } } //第二步,设置复制出来的结点 public static void setClonedNodes(RandomListNode head){ RandomListNode pNode = head; while(pNode!=null){ RandomListNode pCloned = pNode.next; if(pNode.random!=null){ pCloned.random = pNode.random.next; } pNode = pCloned.next; } } //第三步,将第二步得到的链表拆分成两个链表 public static RandomListNode splitNodes(RandomListNode head){ RandomListNode pNode = head; RandomListNode clonedHead = null; RandomListNode clonedNode = null; if(pNode!=null){ clonedHead = pNode.next; clonedNode = pNode.next; pNode.next = clonedNode.next; pNode = pNode.next; } while(pNode!=null){ clonedNode.next = pNode.next; clonedNode = clonedNode.next; pNode.next = clonedNode.next; pNode = pNode.next; } return clonedHead; } }
概要
以上がJava は複雑なリンク リストのコピー コード共有を実装しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。