劍指offer第四天
阿新 • • 發佈:2018-02-02
字符串的排列 == solution pre per int 排列 復制 並且
25.復雜鏈表的復制
輸入一個復雜鏈表(每個節點中有節點值,以及兩個指針,一個指向下一個節點,另一個特殊指針指向任意一個節點),返回結果為復制後復雜鏈表的head。(註意,輸出結果中請不要返回參數中的節點引用,否則判題程序會直接返回空)
/* 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) { //一定註意考慮輸入為空鏈表的情況 if(pHead == null) return null; //第一步:克隆每個結點的值和next,並且將新節點放置在對應舊結點之後 RandomListNode node = pHead; while(node != null){ RandomListNode cloneNode = new RandomListNode(node.label); //cloneNode.label = node.label; cloneNode.next = node.next; node.next = cloneNode; node = cloneNode.next; } //第二步:克隆每個隨機指針 node = pHead; while(node != null){ RandomListNode cloneNode = node.next; if(node.random != null) cloneNode.random = node.random.next; node = cloneNode.next; } //第三步:拆分拼接的鏈表 node = pHead; RandomListNode cloneHead = pHead.next; while(node != null){ RandomListNode cloneNode = node.next; node.next = cloneNode.next; node = node.next; if(node != null) cloneNode.next = node.next; else cloneNode.next = null; } return cloneHead; } }
26.二叉搜索樹與雙向鏈表
輸入一棵二叉搜索樹,將該二叉搜索樹轉換成一個排序的雙向鏈表。要求不能創建任何新的結點,只能調整樹中結點指針的指向。
/** public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } */ public class Solution { public TreeNode Convert(TreeNode pRootOfTree) { if(pRootOfTree == null) return null; if(pRootOfTree.left == null && pRootOfTree.right == null) return pRootOfTree; TreeNode left = Convert(pRootOfTree.left); TreeNode node = left; if(node == null) pRootOfTree.left = null; else{ while(node.right != null) node = node.right; pRootOfTree.left = node; node.right = pRootOfTree; } TreeNode right = Convert(pRootOfTree.right); pRootOfTree.right = right; if(right != null) right.left = pRootOfTree; return left != null ? left : pRootOfTree; } }
27.==字符串的排列==
題目描述
輸入一個字符串,按字典序打印出該字符串中字符的所有排列。例如輸入字符串abc,則打印出由字符a,b,c所能排列出來的所有字符串abc,acb,bac,bca,cab和cba。
輸入描述:
輸入一個字符串,長度不超過9(可能有字符重復),字符只包括大小寫字母。
import java.util.ArrayList; import java.util.HashSet; import java.util.Collections; public class Solution { ArrayList<String> result = new ArrayList<String>(); public ArrayList<String> Permutation(String str) { if(str == null) return null; char[] charArray = str.toCharArray(); permutation(charArray,0); Collections.sort(result); return result; } public void permutation(char[] charArray,int beginIdx){ if(beginIdx >= charArray.length) return; if(beginIdx == charArray.length-1){ result.add(String.valueOf(charArray)); } HashSet<Character> charSet = new HashSet<>(); for(int i = beginIdx;i<charArray.length;i++){ if(i == beginIdx){ charSet.add(charArray[i]); permutation(charArray,beginIdx+1); }else if(i != beginIdx && !charSet.contains(charArray[i])){ char temp = charArray[beginIdx]; charArray[beginIdx] = charArray[i]; charArray[i] = temp; permutation(charArray,beginIdx+1); temp = charArray[beginIdx]; charArray[beginIdx] = charArray[i]; charArray[i] = temp; } } } }
劍指offer第四天