【正在持續更新中······,LODING······】
* 複雜鏈表複製
輸入一個複雜鏈表(每個節點中有節點值,以及兩個指針,一個指向下一個節點,另一個特殊指針指向任意一個節點),返回結果爲複製後複雜鏈表的head。
解題思路:
*1、遍歷鏈表,複製每個結點,如複製結點A得到A1,將結點A1插到結點A後面;
*2、重新遍歷鏈表,複製老結點的隨機指針給新結點,如A1.random = A.random.next;
*3、拆分鏈表,將鏈表拆分爲原鏈表和複製後的鏈表
//複製節點部分。複製並鏈入原節點後。
RandomListNode pNode = pHead;
while(pNode!=null){
RandomListNode newNode = new RandomListNode(pNode.label);
//RandomListNode newNode = pNode;//若替換成本句後,編譯不通過,提示超時或複雜度過大。!。
newNode.next = pNode.next;
pNode.next = newNode;
pNode = newNode.next;
}
* 線索二叉樹
給定一個二叉樹和其中的一個結點,請找出中序遍歷順序的下一個結點並且返回。注意,樹中的結點不僅包含左右子結點,同時包含指向父結點的指針。
解題思路 - -:
1、有右子樹的,那麼下個結點就是右子樹最左邊的點;(eg:D,B,E,A,C,G)
2、沒有右子樹的,也可以分成兩類,
a)是父節點左孩子(eg:N,I,L) ,那麼父節點就是下一個節點 ;
b)是父節點的右孩子(eg:H,J,K,M)找他的父節點的父節點的父節點...直到當前結點是其父節點的左孩子位置。如果沒有eg:M,那麼他就是尾節點。
public class Solution {
TreeLinkNode GetNext(TreeLinkNode node)
{
if(node==null) return null;
if(node.right!=null){ //如果有右子樹,則找右子樹的最左節點
node = node.right;
while(node.left!=null) node = node.left;
return node;
}
while(node.next!=null){ //沒右子樹,則找第一個當前節點是父節點左孩子的節點
if(node.next.left==node) return node.next;
node = node.next;
}
return null; //退到了根節點仍沒找到,則返回null
}
}
* 路徑問題(二叉樹路徑節點和)
輸入一顆二叉樹的跟節點和一個整數,打印出二叉樹中結點值的和爲輸入整數的所有路徑。路徑定義爲從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。(注意: 在返回值的list中,數組長度大的數組靠前)
轉變成---目標值與路徑節點 差值爲零時 ,即可滿足所求路徑。
//全局變量兩個:
ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
ArrayList path = new ArrayList();
//遞歸方法:
public void find(TreeNode root, int sum){
if(root == null) return;
path.add(root.val);
if(root.left==null && root.right==null && sum==root.val) res.add(new ArrayList<Integer>(path));
else{
if(root.left!=null) find(root.left, sum-root.val);
if(root.right!=null) find(root.right, sum-root.val);
}
path.remove(path.size()-1);
}
* 判斷整數數組,是否爲【二叉排序樹的後序遍歷】結果
解法其一:
while(--size)
{
while(sequence[i++]<sequence[size]);
while(sequence[i++]>sequence[size]);
if(i<size)return false;
i=0;
}
return true;
解法其二:
public boolean verifyBST(int[] arr, int start, int end){
if(end<=start) return true;
int i,j;
for(i=start;i<end; i++){
if(arr[i]>arr[end]) break;
}
for(j=i; j<end; j++){
if(arr[j]<arr[end]) return false;
}
return verifyBST(arr, 0, i-1) && verifyBST(arr, i, end-1);
}
* 打印矩陣 -- (由外而內,順時針)
輸入一個矩陣,按照從外向裏以順時針的順序依次打印出每一個數字
public ArrayList<Integer> printMatrix(int [][] matrix) {
ArrayList<Integer> result = new ArrayList<Integer>();
if(matrix==null || matrix.length==0) return result;
int top,bottom,left,right;
top = 0;
left = 0;
bottom = matrix.length - 1;
right = matrix[0].length-1;
while(left<=right && top<=bottom){
if(top<=bottom){
for(int i=left; i<=right; i++){
result.add(matrix[top][i]);
}top++;
}
if(left<=right){
for(int j=top; j<=bottom; j++){
result.add(matrix[j][right]);
}right--;
}
if(top<=bottom){
for(int k=right; k>=left; k--){
result.add(matrix[bottom][k]);
}bottom--;
}
if(left<=right){
for(int l=bottom; l>=top; l--){
result.add(matrix[l][left]);
}left++;
}
}
return result;
}
* 求base的exponent次方。
給定一個double類型的浮點數base和int類型的整數exponent。
如下代碼中,就不用分別考慮exponent的正負情況了!!!牛。
while(exponent!=0){
if((exponent&1)==1)
res*=curr;
curr*=curr;// 翻倍
exponent>>=1;// 右移一位
}
* 求二進制中 1 的個數
--也就是說,把一個整數減去1,再和原整數做與運算,會把該整數最右邊一個1變成0.那麼一個整數的二進制有多少個1,就可以進行多少次這樣的操作。
while(n!=0){ count++; n = n&(n-1); }
* 用兩個棧實現一個隊列的功能?要求給出算法和思路!
<分析>:
入隊:將元素進棧A
出隊:判斷棧B是否爲空,如果爲空,則將棧A中所有元素pop,並push進棧B,棧B出棧;
如果不爲空,棧B直接出棧。
* 用兩個隊列實現一個棧的功能?要求給出算法和思路!
<分析>:
入棧:將元素進隊列A
出棧:判斷隊列A中元素的個數是否爲1,如果等於1,則出隊列,否則將隊列A中的元素 以此出隊列並放入隊列B,直到隊列A中的元素留下一個,然後隊列A出隊列,再把 隊列B中的元素出隊列以此放入隊列A中。