线性表

作者: 06ea7f822f4f | 来源:发表于2020-07-26 01:26 被阅读0次

    什么是线性表

    n个具有相同特性的数据元素的有限序列。
    数据元素之间是一对一的关系。
    

    线性表在数据结构中的分类

    1、顺序表:逻辑结构相邻,物理结构相邻。
    典型代表:数组。
    2、链表:逻辑结构相邻,物理结构不一定相邻。
    代表:数据结构中的栈、队列
    

    关于逻辑结构和物理结构的介绍,可参考链接: https://www.cnblogs.com/tonglingliangyong/p/3944979.html

    顺序表与链表的一些属性

    顺序表:
    优点是随机存取表中的任意元素。
    不足是做插入或删除操作时,需移动大量元素。
    链表:  
    优点是随机插入或删除时只需修改指针指向,不需要移动元素。
    不足是不能对元素进行随机存取。
    

    顺序表与链表的存在形式(以下C/C++形式呈现)

     数组: int array[] = {1, 2, 3, 4};
     链表: struct ListNode {
                              int value;//数据域
                               ListNode* next;//指针域
                             };
    

    应用举例(思路可参考文末)

    一、数组

    1.给定一个数组 {1, 2, 3, 4, 5},将数组中的元素逆序
    

    二、链表

    1.给定一个数组nums和一个目标值,
    在该数组中找出和为目标值的那两个整数,
    并返回他们的数组下表。
    eg:nums = [2, 7, 11, 15]  target = 9 
    因为nums[0] + nums[1] = 2 + 7 = 9  
    所以,返回[0, 1]
    2.给定一个链表:1->2->3->4->5,翻转链表,
    使得最后结果为:5->4->3->2->1
    3.给定一个链表,删除链表的倒数第 n 个节点
    eg: 1->2->3->4->5   n = 2  
    删除倒数第二个节点后,链表变为: 1->2->3->5
    

    思路:
    一、数组

    1.计算出数组a的长度:length  
    2.依次交换a[0] a[length - 1]   
     a[1] a[length - 2] 等的值(可利用异或特性)
    

    二、链表

    1.(1)两层循环,遍历数组,找出满足条件的数据的下标,
    时间复杂度为o(n^2)
    (2)利用map特性,遍历一次数组,将数据作为key, 
    下标index作为value,添加到map中。再遍历一次数组,
    C++中,利用map.find(target - value)
    来判断是否有满足条件的数据,
    时间复杂度为o(n) + o(n),即为o(n)
    2.利用4个指针,分别为pre、cur、next,
    和tmp(暂存next指针的值),把原来next = cur->next,
    修改为pre = cur->next
    3.(1)遍历获取链表的长度,删除倒数第n个节点,
    也就是删除正数第length - n + 1个节点
    (2)用两个指针来处理,first,second,
     先将first指针从列表的开头向前移动 n+1步,
    而第二个指针将从列表的开头出发,两个指针被n个节点分开,
    同时移动两个指针保持恒定间隔,
    直到first指针到达最后一个结点,
    此时第二个指针将指向从最后一个结点数起的第 n个结点。
    重新链接第二个指针所引用的结点的 next 指针
    指向该结点的下下个结点
    核心代码: while (first != NULL) {
            first = first.next;
            second = second.next;
        }
        second.next = second.next.next;
    

    相关文章

      网友评论

          本文标题:线性表

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