翻转链表

两个一组

k个一组

用p记录待翻转链表的前面一个节点,t记录待翻转链表的起始节点。

初始化a指向待翻转链表的第一个节点,b指向第二个节点,然后用for循环去翻转链表。

for循环结束后,翻转就完成了一半了。此时的p代表上一段的末尾,t代表该段的开头,a代表该段的末尾,b代表下一段的开头。这时候如何翻转就很简单了。如下图所示。
CleanShot 2026-08-08 at 00.45.00@2x.png

模版

单链表

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;
最后修改:2026 年 09 月 13 日
如果觉得我的文章对你有用,请随意赞赏