zoukankan      html  css  js  c++  java
  • 算法类

    1、链表

    1.1链表的反转:

    Public void reverse(Node node) {

    Node now = node;

    Node prev = null;

    While(now != null) {
    Node next = now.next;

      now.next = prev;

      prev = now;

      now = next;

    }

    return prev;

    }

    1.2合并两个有序链表

    //非递归

    public class Solution {

        public ListNode Merge(ListNode list1,ListNode list2) {

            if(list1 == null){

                return list2;

            }

            if(list2 == null){

                return list1;

            }

            ListNode current = new ListNode(-1);//创建一个当前指针

            ListNode root = current;//头结点

            while(list1 != null && list2 != null){//当两个链表都不空时

            if(list2.val >= list1.val){//如果第二个链表当前的数值不小于第一个链表当前的数值

                    current.next = list1;//将第一个链表的当前节点加入合并后的链表中

                    current = list1;//当前指针后移

                    list1 = list1.next;//第一个链表指针后移

                }else{

                    current.next = list2;

                    current = list2;

                    list2 = list2.next;                

                }

            }

            if(list1 != null){

                current.next = list1;

            }

            if(list2 != null){

                current.next = list2;

            }

            return root.next;

        }

    }

    //递归

    public class Solution {

        public ListNode Merge(ListNode list1,ListNode list2) {

            if(list1 == null){

                return list2;

            }

            if(list2 == null){

                return list1;

            }

            ListNode head = null;

            if(list1.val <= list2.val){

                head = list1;

                head.next = Merge(list1.next,list2);

            }else{

                head = list2;

                head.next = Merge(list1,list2.next);

            }

            return head;

        }

    }

    2、

    判断树是不是对称的

    public:

    bool isTreeSymmertic(TreeNode *pHead1,TreeNode *pHead2){

    if(pHead1==NULL && pHead2==NULL)

     return true;

     if(pHead1==NULL)

    return false;

    if(pHead2==NULL)

     return false;

    Return(pHead1->val==pHead2->val)

    &&isTreeSymmertic(pHead1->left,pHead2->right)

    &&isTreeSymmertic(pHead1->right,pHead2->left);

    }

     bool isSymmetrical(TreeNode* pRoot) {

    if(pRoot==NULL)

    return true;

    bool res=isTreeSymmertic(pRoot->left,pRoot->right);

     return res;

    }

    3、两个数组合并

    利用Arrays类的Array.asList()方法,另外一种是往新数组里放

    方法1:

    String[]  array1= {"a","b",""c};

    String[]  array2= {"d","e"};

    List list = new ArrayList(Arrays.asList(array1));

    list.addAll(array2);

    String[] newArray = new String[list.size()];

    list.toArray(newArray);

    for(int x=0;x<str.length;x++){

       System.out.print(str[x] + " ");

    }

    方法2:

    String[]  array1= {"a","b",""c};

    String[]  array2= {"d","e"};

    String[] newArray = new String(array1.length + array2.length);

    for(int i=0;i<array1.length;i++){

    newArray[i] = array1[x];

    }

    for(int j = 0; j<array2.length; j++){

    newArray[array1.length + j] = array2[j];

    }

    for(int k=0;k<newArray.length;k++){

     System.out.println(newArray[k]);

    }

    4、二分查找代码(可用递归和非递归方式实现):

    递归

    //假定数组是按照从小到大有序

    public static int search(int[] data,int from,int to,int target) {

    if(from<to){

        int mid = from+(to-from)/2;//防止溢出

    if(data[mid] < target) {

    return search(data,mid+1,to,target );

    }else if(data[mid] > target){

    return search(data,from, mid-1,target);

    }else {

    return mid;

    }

    }

    return -1;

    }

    迭代

    public static int search(int[] data,int from,int to,int target){

    while(from < to){

       int mid = from + (to-from)/2;

       if(data[mid]<target){

           from = mid +1;

       }else if(data[mid]>target){

       to = mid -1;

       }else {

       return mid;

       }

    }

    return -1

    }

     5、快速排序

    public void sort(int a[], int low, int high) {

    int left = low;

    int right = high;

    //基准数

    int pivot = a[left];

    while(left<right) {

    //从右往左找小于基准值的元素

    while(left<right && a[right]>=pivot) {

    right--;

    }

    a[left]=a[right];

    //从左往右找大于基准值的元素

    while(left<right && a[left] <= pivot) {

    left++;

    }

    a[right]=a[left];

    }

    //以上操作完成后,基准值已经确定挖下的坑了,然后填数

    a[left]=pivot;

    //递归左边和右边

    sort(a,low,left-1);

    sort(a,left+1,high);

    }

    6、将二叉树转双向链表:

    1、以最左节点作为头节点2、链表顺序为中序遍历3、不允许使用额外空间

    class TreeNode{
        TreeNode left;
        TreeNode right;
        int val;
        public TreeNode(int val){
            this.val = val;
        }
    }
    public class Test5 {
        static TreeNode pre = null;
        static TreeNode cur = null;
        static TreeNode head = null;
        public static void main(String []args){
            inorder(n1);
        }
    
        public static void inorder(TreeNode root){
            if(root == null){
                return;
            }else {
                inorder(root.left);
                System.out.println(root.val);
                t(root);
                inorder(root.right);
            }
        }
    
        public static void t(TreeNode root){
            if(pre == null){
                pre = root;
                head = root;
                return;
            }else {
                cur = root;
            }
            System.out.println("pre : "+pre.val + "cur : " + cur.val);
            pre.right = cur;
            cur.left = pre;
            pre = cur;
        }
    }

     

     

  • 相关阅读:
    简单系统音乐播放与视频播放
    项目前准备1
    runtime
    多控制器
    maven的依赖冲突时的原则
    maven 依赖的传递性
    MAVN(自动创建maven项目骨架) 项目架构的生成
    MAVEN 构建包的引用
    MAVEN的结构认识篇
    LINUX 中 VSFTPD安裝
  • 原文地址:https://www.cnblogs.com/tilamisu007/p/9642833.html
Copyright © 2011-2022 走看看