美文网首页
链表专项练习

链表专项练习

作者: 简朴_ | 来源:发表于2020-12-03 12:42 被阅读0次

    面试链表方法论:
    笔试:不用在乎空间复杂度,一切为时间复杂度。
    面试:时间复杂度放第一位,但是一定找到空间最省的方法。

    链表面试题常用数据结构合技巧

    1. 使用容器(哈希表、数组):
    2. 快慢指针

    快慢指针:


    QQ图片20201204131146.jpg

    有两种方法 笔试下下方法 (容器)、面试上方法coding

    package class06;
    
    import java.util.ArrayList;
    
    public class Code01_LinkedListMid {
    
        public static class Node {
            public int value;
            public Node next;
    
            public Node(int v) {
                value = v;
            }
        }
    
        // head 头
        public static Node midOrUpMidNode(Node head) {
            // 前面不成立 、 唯一一个点、有一个点
            // 过滤 没有点时候 有一个点的时候 有两个点的时候
            if (head == null || head.next == null || head.next.next == null) {
                return head;
            }
    
            // 创建快慢指针
            // 链表有3个点或以上
            Node slow = head.next;
            Node fast = head.next.next;
    
            while (fast.next != null && fast.next.next != null) {
                slow = slow.next;
                fast = fast.next.next;
            }
            return slow;
        }
    
        public static Node midOrDownMidNode(Node head) {
            if (head == null || head.next == null) {
                return head;
            }
            Node slow = head.next;
            Node fast = head.next;
            while (fast.next != null && fast.next.next != null) {
                slow = slow.next;
                fast = fast.next.next;
            }
            return slow;
        }
    
        public static Node midOrUpMidPreNode(Node head) {
            if (head == null || head.next == null || head.next.next == null) {
                return null;
            }
            Node slow = head;
            Node fast = head.next.next;
            while (fast.next != null && fast.next.next != null) {
                slow = slow.next;
                fast = fast.next.next;
            }
            return slow;
        }
    
        public static Node midOrDownMidPreNode(Node head) {
            if (head == null || head.next == null) {
                return null;
            }
            if (head.next.next == null) {
                return head;
            }
            Node slow = head;
            Node fast = head.next;
            while (fast.next != null && fast.next.next != null) {
                slow = slow.next;
                fast = fast.next.next;
            }
            return slow;
        }
    
        public static Node right1(Node head) {
            if (head == null) {
                return null;
            }
            Node cur = head;
            ArrayList<Node> arr = new ArrayList<>();
            while (cur != null) {
                arr.add(cur);
                cur = cur.next;
            }
            return arr.get((arr.size() - 1) / 2);
        }
    
        public static Node right2(Node head) {
            if (head == null) {
                return null;
            }
            Node cur = head;
            ArrayList<Node> arr = new ArrayList<>();
            while (cur != null) {
                arr.add(cur);
                cur = cur.next;
            }
            return arr.get(arr.size() / 2);
        }
    
        public static Node right3(Node head) {
            if (head == null || head.next == null || head.next.next == null) {
                return null;
            }
            Node cur = head;
            ArrayList<Node> arr = new ArrayList<>();
            while (cur != null) {
                arr.add(cur);
                cur = cur.next;
            }
            return arr.get((arr.size() - 3) / 2);
        }
    
        public static Node right4(Node head) {
            if (head == null || head.next == null) {
                return null;
            }
            Node cur = head;
            ArrayList<Node> arr = new ArrayList<>();
            while (cur != null) {
                arr.add(cur);
                cur = cur.next;
            }
            return arr.get((arr.size() - 2) / 2);
        }
    
        public static void main(String[] args) {
            Node test = null;
            test = new Node(0);
            test.next = new Node(1);
            test.next.next = new Node(2);
            test.next.next.next = new Node(3);
            test.next.next.next.next = new Node(4);
            test.next.next.next.next.next = new Node(5);
            test.next.next.next.next.next.next = new Node(6);
            test.next.next.next.next.next.next.next = new Node(7);
            test.next.next.next.next.next.next.next.next = new Node(8);
    
            Node ans1 = null;
            Node ans2 = null;
    
            ans1 = midOrUpMidNode(test);
            ans2 = right1(test);
            System.out.println(ans1 != null ? ans1.value : "无");
            System.out.println(ans2 != null ? ans2.value : "无");
    
            ans1 = midOrDownMidNode(test);
            ans2 = right2(test);
            System.out.println(ans1 != null ? ans1.value : "无");
            System.out.println(ans2 != null ? ans2.value : "无");
    
            ans1 = midOrUpMidPreNode(test);
            ans2 = right3(test);
            System.out.println(ans1 != null ? ans1.value : "无");
            System.out.println(ans2 != null ? ans2.value : "无");
    
            ans1 = midOrDownMidPreNode(test);
            ans2 = right4(test);
            System.out.println(ans1 != null ? ans1.value : "无");
            System.out.println(ans2 != null ? ans2.value : "无");
    
        }
    
    }
    
    

    相关文章

      网友评论

          本文标题:链表专项练习

          本文链接:https://www.haomeiwen.com/subject/yodmwktx.html