什么是线性表
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;