[toc]
图算法
static int[][] a; // 邻接矩阵存储图信息; Integer.MAX_Value代表两个节点不相邻; 0 代表该节点本身,其余值代表路径长度
    private static int n, m;
    
    // 深搜算法,从 u 节点开始遍历;
    void dfs(int u, boolean[] bool) {
        bool[u] = true;
        visit(u);
        for(int i=0; i<n; i++) {
            if(!bool[i] && a[u][i] != Integer.MAX_VALUE) dfs(i, bool);
        }
    }
    
    //广搜算法, 从u节点开始遍历;
    void bfs(int u) {
        boolean[] bool = new boolean[n];
        Queue<Integer> q = new LinkedList<>();
        q.offer(u);
        while(!q.isEmpty()) {
            int v = q.poll();
            bool[v] = true;
            visit(v);
            for(int i=0; i<n; i++) {
                if(!bool[i] && a[v][i] != Integer.MAX_VALUE) q.offer(i);
            }
        }
    }
    
    void visit(int u) {
        System.out.println("遍历到了节点:" + u);
    }
    
    // 拓扑排序算法;
    void topology() {
        int[] num = new int[n];
        for(int i=0; i<n; i++) {
            for(int j=0; j<n; j++) {
                if(a[i][j] != 0 && a[v][i] != Integer.MAX_VALUE) num[j] ++;
            }
        }
        Queue<Integer> q = new LinkedList<>();
        for(int i=0; i<n; i++) {
            if(num[i] == 0) q.offer(i);
        }
        while(!q.isEmpty()) {
            int u = q.poll();
            visit(u);
            for(int i=0; i<n; i++) {
                if(i != u && a[u][i] != Integer.MAX_VALUE && num[i] > 0) {
                    num[i] --;
                    if(num[i] == 0) q.offer(i);
                }
            }
        }
        
    }
以及最短路径算法
void dijkstra(int s, int n) {
    vector<int> dis;
    dis.resize(n+1, maxn);
    dis[s]=0;
    vector<bool> b;
    b.resize(n+1, false);
    for (int i=1; i<=n; i++) {
        int u=-1, min=maxn;
        for (int j=1; j<=n; j++) {
            if (!b[j] && dis[j]<min) {
                min=dis[j];
                u=j;
            }
        }
        if (u==-1) printf("图并非连通...");
        b[u]=true;
        for (int j=1; j<=n; j++) {
            if (dis[u]+a[u][j]<dis[j]) dis[j]=dis[u]+a[u][j];
        }
    }
}
树算法
import java.util.*;
public class Tree {
    class TreeNode {
        int val;
        TreeNode left, right;
        TreeNode(int val) {
            this.val = val;
        }
    }
    
    public static void main(String[] args) {
        int[] a = {4, 2, 6, 1, 3, 5, 7};
        Tree t = new Tree();
        TreeNode root = t.creatTree(a);
        t.after2(root);
    }
    
    TreeNode creatTree(int[] a) {
        if(a == null || a.length == 0) return null;
        TreeNode head = null;
        for (int i = 0; i<a.length; i++) {
            head = insert(head, a[i]);
        }
        return head;
    }
    
    TreeNode insert(TreeNode root, int val) {
        if(root == null) return new TreeNode(val);
        if(val >= root.val) root.right = insert(root.right, val);
        else root.left = insert(root.left, val);
        return root;
    }
    
    void pre(TreeNode root) {
        if (root == null) return;
        Stack<TreeNode> s = new Stack<>();
        s.push(root);
        while(!s.isEmpty()) {
            TreeNode p = s.pop();
            visit(p);
            if(p.right != null) s.push(p.right);
            if(p.left != null) s.push(p.left);
        }
    }
    
    void mid(TreeNode root) {
        if (root == null) return;
        Stack<TreeNode> s = new Stack<>();
        TreeNode p = root;
        while(p != null || !s.isEmpty()) {
            while(p != null) {
                s.push(p);
                p = p.left;
            }
            if(!s.isEmpty()) {
                p = s.pop();
                visit(p);
                p = p.right;
            }
        }
    }
    
    void after(TreeNode p) {
        Stack<TreeNode> stack = new Stack<TreeNode>();  
        TreeNode node = p, prev = p;  
        while (node != null || stack.size() > 0) {  
            while (node != null) {  
                //System.out.println("push:" + node.val);
                stack.push(node);  
                node = node.left;  
            }  
            if (stack.size() > 0) {  
                TreeNode temp = stack.peek().right;  
                if (temp == null || temp == prev) {  
                    //if(temp == null) 
                        //System.out.println("temp = null");
                    //else 
                        //System.out.println("pre=" + prev.val);
                    
                    node = stack.pop();  
                    visit(node);  
                    prev = node;  
                    node = null;  
                } else {  
                    node = temp;  
                }  
            }  
        }  
    }
    
    void after2(TreeNode root) {
        TreeNode p = root;
        Stack<TreeNode> s1 = new Stack<>();
        Stack<TreeNode> s2 = new Stack<>();
        while(p != null || !s1.isEmpty()) {
            while(p != null) {
                s1.push(p);
                s2.push(p);
                p = p.right;
            }
            if(!s1.isEmpty()) {
                p = s1.pop();
                p = p.left;
            }
        }
        while(!s2.isEmpty()) {
            p = s2.pop();
            visit(p);
        }
    }
    
    void visit(TreeNode r) {
        System.out.println("visit:" + r.val);
    }
    
    
}
手写LRU
package com.gastby.utils;
import java.util.*;
public class MyLRUCache<K, V> {
    
    class CacheNode {
        Object key;
        Object value;
        CacheNode pre, next;
        CacheNode(Object key, Object o) {
            this.key = key;
            value = o;
        }
        public String toString() {
            return "key:" + key + ", value:" + value;
        }
    }
    
    private CacheNode head, tail;
    private HashMap<K, CacheNode> map;
    private int MaxSize;
    
    MyLRUCache(int n) {
        MaxSize = n;
        map = new HashMap<>();
    }
    
    public void put(K key, V value) {
        CacheNode node = map.get(key);
        if(node == null) {
            if(map.size() >= MaxSize) {
                map.remove(tail.key);
                removeTail();
            }
            node = new CacheNode(key, value);
            map.put(key, node);
        }
        moveToHead(node);
    }
    
    public Object get(K key) {
        CacheNode node = map.get(key);
        if (node == null) return null;
        moveToHead(node);
        return node.value;
    }
    
    public void moveToHead(CacheNode node) {
        if(node == head) return;
        if(node.pre != null) node.pre.next = node.next;
        if(node.next != null) node.next.pre = node.pre;
        if(node == tail) tail = tail.pre;
        if(head == null) {
            head = tail = node;
            return;
        }
        node.next = head;
        head.pre = node;
        head = node;
        head.pre = null;
    }
    
    public Object delete(K key) {
        CacheNode node = map.get(key);
        if(node  == null) return null;
        if(node.pre != null){
            node.pre.next=node.next;
        }
        if(node.next != null){
            node.next.pre=node.pre;
        }
        if(node == head){
            head = node.next;
        }
        if(node == tail){
            tail = node.pre;
        }
        map.remove(key);
        return node.value;
    }
    
    public void removeTail() {
        if (tail != null) {
            map.remove(tail.key);
            tail = tail.pre;
            if (tail == null) {
                head = null;
            } else {
                tail.next = null;
            }
        }
    }
    
    public int getSize() {
        return map.size();
    }
    
    public void showNodes() {
        CacheNode p = head;
        while(p != null) {
            System.out.print(p + ",");
            p = p.next;
        }
        System.out.println();
    }
    
    public static void main(String[] args) {
        MyLRUCache<Integer, String> m = new MyLRUCache<>(5);
        m.put(1, "tom");
        m.put(2, "july");
        m.put(3, "lily");
        m.put(4, "sandy");
        m.put(5, "peter");
        m.showNodes();
        m.get(3);
        m.showNodes();
        m.put(6, "jane");
        m.showNodes();
        m.delete(3);
        m.showNodes();
        m.removeTail();
        m.showNodes();
    }
}
排序算法
//快速排序,k从0到a.lenght-1取值;
//利用快排思想找第k个数字,在内部排好序了,直接取值a[k]即可;
    void quickSort(int[] a, int k) {
        int l=0, r = a.length-1;
        while (l < r) {
            int j = patition(a, l, r);
            if (k == j) break;
            else if (k < j) r = j - 1;
            else l = j + 1;
        }
    }
    int patition(int[] a, int l, int r) {
        int p = a[r], index = l - 1;
        for (int i=l; i<r; i++) {
            if (a[i] < p) {
                int temp = a[++index];
                a[index] = a[i];
                a[i] = temp;
            }
        }
        int temp = a[++index];
        a[index] = a[r];
        a[r] = temp;
        return index;
    }
        void heapSort(int[] a) {
        int n = a.length-1;
        for (int i=n; i>0; i--) {
            int temp = a[0];
            a[0] = a[i];
            a[i] = temp;
            sink(a, 0, i-1);
        }
    }
    
    void createHeap(int[] a) {
        int k = a.length/2-1;
        for (int i=k; i>=0; i--) {
            sink(a, i, a.length-1);
        }
    }
    
    void sink(int[] a, int i, int n) {
        int l = 2*(i+1)-1, r = 2*(i+1), max = i;
        if (l<= n && a[l] > a[i]) {
            max = l;
        }
        if (r<= n && a[r] > a[max]) {
            max = r;
        }
        if (max != i) {
            int temp = a[i];
            a[i] = a[max];
            a[max] = temp;
            sink(a, max, n);
        }
    }
链表算法
public class Main{
    public static void main(String[] args) {
        int[] a = {1, 4, 4, 4, 13, 13, 24, 35};
        Node root = create(a);
        print(root);
        root = clearDuplicate(root);
        print(root);
    }
    
    static void print(Node root) {
        Node p = root;
        while (p != null) {
            System.out.print(p.val + " ");
            p = p.next;
        }
        System.out.println();
    }
    // 创建一个链表
    static Node create(int[] a) {
        Node head = null, p = head;
        for(int i=0; i<a.length; i++) {
            Node temp = new Node(a[i]);
            if(p == null) {
                p = temp;
                head = p;
            } else {
                p.next = temp;
                p = p.next;
            }
        }
        return head;
    }
    
 Node paritialReverse(Node head, int start, int end) {
        if(start < 1 || start >= end || head == null) return head;
        Node fakeHead = new Node(-1);
        fakeHead.next = head;
        int i = 0;
        Node p = fakeHead, q = p;
        while(i < start-1 && p != null) {
            if(p.next == null) return fakeHead.next;
            p = p.next;
            i ++;
        }
        i = 0;
        while(i < end && q != null) {
            if(q.next == null) break;
            q = q.next;
            i ++;
        }
        Node temp = q.next;
        q.next = null;
        q = temp;
        p.next = reverse(p.next);
        while(p.next != null) p = p.next;
        p.next = q;
        return fakeHead.next;
    }
    // 逆转链表
    static Node reverse(Node root) {
        Node p = root, q = null, r;
        while(p != null) {
            r = q;
            q = p;
            p = p.next;
            q.next = r;
        }
        return q;
    }
    // sort two sorted linkedlist to one linkedlist;
    static Node compute(Node r1, Node r2) {
        Node head = new Node(-1), p = head;
        while(r1 != null || r2 != null) {
            if(r1 == null) {
                p.next = r2;
                break;
            } else if(r2 == null) {
                p.next = r1;
                break;
            } else {
                if (r1.val < r2.val) {
                    p.next = r1;
                    r1 = r1.next;
                } else {
                    p.next = r2;
                    r2 = r2.next;
                }
                p = p.next;
                p.next = null;
            }
        }
        return head.next;
    }
    // remove all the duplicated elements to make sure the number is 1;
    static Node deleteDuplicate(Node root) {
        if(root == null) return root;
        Node temp = root;
        Node p = temp.next;
        while(p != null) {
            if(p.val == temp.val) {
                while(p != null && p.val == temp.val) p = p.next;
                temp.next = p;
                if(p == null) return root;
                temp = temp.next;
            } else {
                temp = p;
            }
            p = p.next;
        }
        return root;
    }
    
    // remove all the elements whose numbers is more than once; 
    static Node clearDuplicate(Node root) {
        if(root == null) return root;
        Node head = new Node(-1);
        Node p = head, temp = root;
        while(temp != null) {
            if(temp.next == null || temp.next.val != temp.val) {
                p.next = temp;
                p = p.next;
                temp = temp.next;
                p.next = null;
            } else {
                while (temp.next != null && temp.next.val == temp.val) temp = temp.next;
                temp = temp.next;
            }
        }
        return head.next;
    }
    
    //复制任意链表节点
    static RandomListNode Clone(RandomListNode head) {
        if(head == null) return head;
        RandomListNode r = head;
        while (r != null) {
            RandomListNode temp = new RandomListNode(r.label);
            temp.next = r.next;
            r.next = temp;
            r = temp.next;
        }
        r = head;
        while(r != null) {
            RandomListNode clone = r.next;
            if(r.random != null)
                clone.random = r.random.next;
            r = clone.next;
        }
        r = head;
        RandomListNode clone = head.next;
        while(r.next != null) {           
            RandomListNode next = r.next;
            r.next = next.next;
            r = next;            
        }
        return clone;
    }
    
    
}
class RandomListNode {
    int label;
    RandomListNode next = null;
    RandomListNode random = null;
    RandomListNode(int label) {
        this.label = label;
    }
}
class TreeNode {
    int val;
    TreeNode left, right;
    TreeNode(int val) {
        this.val = val;
    }
}
class Node {
    int val;
    Node next;
    Node(int val) {
        this.val = val;
    }
}











网友评论