1、反转一个单链表
public static Node reverse(Node head) { if (null == head) { return head; } Node pre = head; Node cur = head.getNextNode(); Node next; while (null != cur) { next = cur.getNextNode(); cur.setNextNode(pre); pre = cur; cur = next; } // 将原链表的头节点的下一个节点置为null,再将反转后的头节点赋给head head.setNextNode(null); head = pre; return head; }
2、求一个给定二叉树上两个节点a,b的最近公共父节点
TreeNode FindFirstCommonParentNode(TreeNode pRoot, TreeNode pNodeOne, TreeNode pNodeTwo) { if (NULL == pRoot) { return NULL; } if (pRoot == pNodeOne || pRoot == pNodeTwo) { return pRoot; } TreeNode pLeft = FindFirstCommonParentNode(pRoot.left(), pNodeOne, pNodeTwo); TreeNode pRight = FindFirstCommonParentNode(pRoot.right(), pNodeOne, pNodeTwo); if (NULL == pLeft) //1、左子树没有找到任何一个结点,则第一个公共父节点必定在右子树,而且找到第一个结点就是最低共同父节点 { return pRight; } else if (NULL == pRight) //2、右子树没有找到任何一个结点,则第一个公共父节点必定在左子树,而且找到第一个结点就是最低共同父节点 { return pLeft; } else //3、分别在结点的左右子树找到,则此节点必为第一个公共父节点 { return pRoot; } }
3、中文转数字,例如三万五千四百二十-->35420
public static long parse(String money) { long result = 0; char c = 0; boolean flag = Pattern.matches("^.*亿.*万.*$", money); for (int i = 0; i < money.length(); i++) { switch (money.charAt(i)) { case '零': break; case '一': c = 1; break; case '二': c = 2; break; case '三': c = 3; break; case '四': c = 4; break; case '五': c = 5; break; case '六': c = 6; break; case '七': c = 7; break; case '八': c = 8; break; case '九': c = 9; break; case '十': result += (c == 0 ? 10 : c * 10); c = 0; break; case '百': result += c * 100; c = 0; break; case '千': result += c * 1000; c = 0; break; case '万': result = (result + c) * 10000; c = 0; break; case '亿': if (flag){ result = (result + c) * 10000; }else{ result = (result + c) * 100000000; } c = 0; break; default: c = 0; } } if (c != 0) result += c; return result; }