本文共 1392 字,大约阅读时间需要 4 分钟。
静态链表是一种通过数组结构来模拟链表的数据结构,特别适用于结点地址较小的场景。在本题中,我们需要寻找两条链表(两个单词)中的最大公共后缀的起始位置。
静态链表通过数组实现,每个数组位置代表一个结点。结点包含数据域和指针域:
struct Node { char data; int next;}
其中,data
表示结点的字符,next
表示指向下一个结点的地址。因为结点地址较小,可以直接用数组索引无需频繁分配内存。
#include#include #include const int maxn = 1000000; // 假设每个单词最多构造1e6个节点struct Node { char data; int next;} node[maxn];void build_link_list(char* first_address, char* second_address, int n, Node* node) { int curr = first_address; while (curr != -1) { node[curr].data = 0; // 初始化无效节点 if (curr == first_address || curr == second_address) { node[curr].data = (uintptr_t)(void*)curr; // 记录结点地址(可选) } // 其余节点不需要记录数据 if (curr != second_address) { node[curr].next = curr + 1; // 标准链表方式:next = 下一个地址 } else { node[curr].next = -1; } curr = node[curr].next; }}int main() { // 输出帮助信息 // 第三步的示例中有错误,请修正 return 0;}
在构建静态链表后,逐个结点遍历,确保每个节点的next
指针正确连接。然后,从两个链表的结尾向前逐个字符比较,找到最长共同子串的开始位置。
此外,需要注意以下几点:
uintptr_t
或size_t
处理大型数组索引,以避免大小 endian 方向差异影响。通过以上步骤,可以高效地找到最大公共后缀的位置,解决问题。
转载地址:http://ixsiz.baihongyu.com/