題目
輸入一個復雜鏈表(每個節點中有節點值,以及兩個指針,一個指向下一個節點,另一個特殊指針指向任意一個節點),返回結果為復制后復雜鏈表的head。(注意,輸出結果中請不要返回參數中的節點引用,否則判題程序會直接返回空)
解決思路
思路1:
先復制原始鏈表的結點
在元素鏈表的頭結點開始找每個結點的random。每次都要從投開始找,然后連接起來,所以時間復雜度是o(n*n)
思路2:
用空間換時間。創建一個map映射表。<N,N'>(原始結點,復制的結點)。找到結點的random時間復雜度是o(1)。所以最后是o(n)。
思路3:
代碼
public class Main { public static class RandomListNode { int label; RandomListNode next = null; RandomListNode random = null; RandomListNode(int label) { this.label = label; } } public RandomListNode Clone(RandomListNode pHead) { if(pHead==null) return null; //復制原始鏈表並創建新節點N',把N'連接到N的后面 RandomListNode pNode=pHead; while(pNode!=null){ RandomListNode pClone=new RandomListNode(pNode.label); pClone.next=pNode.next; pClone.random=null; pNode.next=pClone; pNode=pClone.next; } //設置N'的random RandomListNode pNode2=pHead; while(pNode2!=null){ if(pNode2.random!=null){ pNode2.next.random=pNode2.random.next; } pNode2=pNode2.next.next; } //把長鏈表拆分成兩個鏈表,奇數位置節點是原始鏈表,偶數位置的結點是復制后的鏈表 RandomListNode pNode3=pHead; RandomListNode pCloneHead=null; RandomListNode pCloneNode=null; if(pNode3!=null){ pCloneHead=pCloneNode=pNode3.next; pNode3.next=pCloneNode.next; pNode3=pNode3.next; } while(pNode3!=null){ pCloneNode.next=pNode3.next; pCloneNode=pCloneNode.next; pNode3.next=pCloneNode.next; pNode3=pNode3.next; } return pCloneHead; } public static void main(String[] args) { // TODO Auto-generated method stub RandomListNode head=new RandomListNode(1); RandomListNode b=new RandomListNode(2); RandomListNode c=new RandomListNode(3); RandomListNode d=new RandomListNode(4); RandomListNode e=new RandomListNode(5); head.next=b; head.random=c; b.next=c; b.random=e; c.next=d; c.random=null; d.next=e; d.random=b; e.next=null; e.random=null; Main m=new Main(); RandomListNode temp=null; temp=m.Clone(head); while(temp!=null){ System.out.println(temp.label); temp=temp.next; } } }