美文网首页
算法通关2.数组和链表

算法通关2.数组和链表

作者: YangDxg | 来源:发表于2019-08-21 14:49 被阅读0次

数组

数组:内存里连续的一段存储区域

取:取元素时间复杂度为O(1)

插入:需要挪动插入位置后面的元素,时间复杂度为O(n)

删除:同插入,后面的元素需要向前挪动,时间复杂度为O(n)

链表

单向链表:用一个指针链向下一个元素

双向链表:用俩个指针链向上一个元素和下一个元素

增加删除只需要更改指针指向即可,时间复杂度O(1)

查找时间复杂度是O(n)

练习

  1. leetcode206反转链表

    输入: 1->2->3->4->5->NULL
    输出: 5->4->3->2->1->NULL
    

    思路:定义俩个变量,记录当前节点和上一个节点,采用俩数交换的方式进行反转

    class Solution {
        public ListNode reverseList(ListNode head) {
            ListNode cur = head;
            ListNode prev = null;
            ListNode tempNext = null;
            while (cur != null) {
                tempNext = cur.next;
                cur.next = prev;
                prev = cur;
                cur = tempNext;
            }
            return prev;
        }
    }
    
  2. leetcode24两两交互链表中的节点

    给定 1->2->3->4, 你应该返回 2->1->4->3.
    

    递归解乏

        public static ListNode swapPairs(ListNode head) {
            if (head == null || head.next == null) {
                return head;
            }
            ListNode next = head.next;
            head.next = swapPairs(next.next);
            next.next = head;
            return next;
        }
    

    非递归解法

        public static ListNode swapPairs2(ListNode head) {
            ListNode prev = new ListNode(0);
            prev.next = head;
            ListNode temp = prev;
            while (temp.next != null && temp.next.next != null) {
                ListNode start = temp.next;
                ListNode end = temp.next.next;
                temp.next = end;
                start.next = end.next;
                end.next = start;
                temp = start;
            }
            return prev.next;
        }
    
  3. 环形链表

    给定一个链表,判断链表中是否有环。

    输入:head = [3,2,0,-4], pos = 1
    输出:true
    解释:链表中有一个环,其尾部连接到第二个节点。
    
    img

思路:如何判断一个链表是否有环

  1. 硬做(在0.5s内判断会不会走到null,性能很差)

  2. 把走过的节点放到set中,每到新节点判断set中有没有进行判重,时间复杂度O(n)

        public boolean hasCycle(ListNode head) {
            Set<ListNode> nodes = new HashSet<>();
            while (head != null) {
                if (nodes.contains(head)) {
                    return true;
                }
                nodes.add(head);
                head = head.next;
            }
            return false;
        }
    
  3. 龟兔赛跑式(快慢指针),快指针每次走俩步,慢指针每次走一步,快慢相遇说明有环

        public boolean hasCycle(ListNode head) {
            if (head == null || head.next == null) {
                return false;
            }
            ListNode fast = head;
            ListNode slow = head;
            while (fast.next != null && fast.next.next != null) {
                slow = slow.next;
                fast = fast.next.next;
                if (slow == fast) {
                    return true;
                }
            }
            return false;
        }
    

相关文章

  • 算法通关2.数组和链表

    数组 数组:内存里连续的一段存储区域 取:取元素时间复杂度为O(1) 插入:需要挪动插入位置后面的元素,时间复杂度...

  • 算法通关 - 数组和链表

    算法学习方法 坚持、刻意练习 练习缺陷、弱点地方 不舒服、枯燥是正常的 LeetCode做题要考虑时间复杂度,尽量...

  • 算法面试通关-数组&链表《二》

    数组 连续的存储随机访问 查找:O(1)插入:平均 O(n)删除:平均 O(n) 链表 插入和删除操作比较多不知道...

  • 简单的数据结构

    1. 数组 array 所谓数组,是有序的元素序列 2. 链表 list 属于线性表, 分为单链表和双链表,单链表...

  • HashMap面试问题总结

    1. HashMap底层的数据结构是什么? 1.8 数组+链表+红黑树 2. JDK 1.8中对hash算法和寻址...

  • 2021-02-18 假期刚过,面试你准备了HashMap吗

    程序的本质是数据结构和算法(执行逻辑)数组栈队列链表树散列表堆图 图解HashMap 数组 + 链表 + 红黑树 ...

  • 2019 算法面试相关(leetcode)--字符串

    1、七种常见的数组排序算法整理(C语言版本)2、2019 算法面试相关(leetcode)--数组和链表3、201...

  • 2018 iOS面试题---算法相关

    1、七种常见的数组排序算法整理(C语言版本)2、2019 算法面试相关(leetcode)--数组和链表3、201...

  • 数据结构之链表

    (上)如何实现LRU缓存淘汰算法? 一、什么是链表? 1.和数组一样,链表也是一种线性表。2.从内存结构来看,链表...

  • 数据结构与算法第三讲 - 链表

    本讲内容 链表定义和分类链表和数组比较链表操作写链表代码的技巧简单算法题 链表定义和分类 定义:通过指针把零散的内...

网友评论

      本文标题:算法通关2.数组和链表

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