这里选择一些关于线性表的leetcode的习题。这些习题主要以顺序表和链表为主,需要熟练掌握顺序表和单链表的基本操作,同时综合使用之前学习过的一些算法设计方法和技巧。
习题的顺序与难度无关。
删除有序数组重复元素(Remove Duplicates from Sorted Array)
给定一个已经排序的数组,删除里面的重复元素,保证每个元素只出现一次,并返回新的数组长度。要求使用 O(1) 的空间复杂度。例如[1,1,2]
应该得到[1,2]
,长度为2
。
解这个问题,应该很容易联系到2.2节的例题——删除所有指定值的元素。有两种思路,一个是维护新元素需要迁移的位数,一个是维护新元素的新的下标,即相当于重建线性表。这里选择第二种思路,更容易实现操作。
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
if(nums.empty()){
return 0;
}
int i;
int newid = 1;
for(i = 1; i < nums.size(); ++i){
if(nums[newid - 1] != nums[i]){
nums[newid++] = nums[i];
}
}
return newid;
}
};
反转链表的一部分(Reverse Linked List II)
给定一个链表和两个数 m 和