翻转链表
两个一组
k个一组
用p记录待翻转链表的前面一个节点,t记录待翻转链表的起始节点。
初始化a指向待翻转链表的第一个节点,b指向第二个节点,然后用for循环去翻转链表。
for循环结束后,翻转就完成了一半了。此时的p代表上一段的末尾,t代表该段的开头,a代表该段的末尾,b代表下一段的开头。这时候如何翻转就很简单了。如下图所示。
模版
单链表
int e[N], ne[N], idx;
void (int k, int x )
{
e[idx] = x, ne[idx] = ne[k], idx ++;
}
void add(int k, int x)
{
}
void remove(int k)
{
}二分查找
模版
target点t把nums分为两部分,一部分是t左边的点,一部分是t右边的点(包括t)。去包括t的这部分点的性质作为要求。
比如:
在严格递增数组nums中找到一个数x。x左边的所有的点都小于x,右边的点都大于x。右边的所有点包括x的性质就是:大于等于x。所以取的性质就是: 大于等于x。
当然也可以把x归为左半边,这时候性质就是:小于等于x。二分后找到的数就是这半边满足性质的第一个数。
因为要l和r移动了,才有效排除。所以如果最后二分的点在第一个位置或者最后一个位置,说明只有一个指针移动了,这时候要特判一下。
int l = 0, r = nums.size() - 1;
while (l < r) {
int mid = l + r >> 1;
if (nums[mid] 满足满足要求) r = mid;
else l = mid + 1;
}
return r;