问题是编写一个伪代码,如果给定的单向链表在两个方向上读取相同,则返回true,否则返回false。此外,我们知道存储在变量n
中的列表的大小。预期的解决方案应具有计算复杂度O(n)和存储器复杂度O(1)。
示例:1-> 2-> 3-> 3-> 2-> 1返回true
示例:1-> 2-> 3-> 1->>> 3返回false
答案 0 :(得分:0)
可以反转单向链接列表,执行单次传递(请参阅本答案的结尾)。对额外内存的限制在这项任务中非常有限,所以我认为最好的方法有点笨拙。
n/2
之后)。保存指向列表中最后一个元素的指针 - 您将在步骤2中使用它。n/2
和反转部分(从n到n/2
)。您在两个部分中迭代的元素应该匹配。为此你需要两个变量 - 一个迭代第一部分,一个迭代第二部分(一个记住你已经处理了多少元素)。总的来说,我符合任务的要求。
反转单向链表的算法是这样的(以c ++为例):
struct node {
node* next;
int data;
};
// reverses a one-way list and returns pointer to the new list head
node* reverse(node* c) {
node* prev = NULL;
node* cur = c;
// I assume the list is NULL terminated;
while (cur) {
node* temp = cur->next;
cur->next = prev;
prev = cur;
cur = temp;
}
return prev;
}