问题是编写一个伪代码,返回true如果给定的单向链表读取相同的两个方向,否则为false。另外我们知道存储在变量n
中的列表的大小。预期的解决方案应该具有计算复杂度O(n)和存储器复杂度O(1)。我有一个采访,他们问我,我不知道答案我得到一个答案
例如:1-> 2-> 3-> 3-> 2-> 1返回真
例如:1-> 2-> 3-> 1-> 2-> 3返回假
问题是编写一个伪代码,返回true如果给定的单向链表读取相同的两个方向,否则为false。另外我们知道存储在变量n
中的列表的大小。预期的解决方案应该具有计算复杂度O(n)和存储器复杂度O(1)。我有一个采访,他们问我,我不知道答案我得到一个答案
例如:1-> 2-> 3-> 3-> 2-> 1返回真
例如:1-> 2-> 3-> 1-> 2-> 3返回假
可以颠倒一个单向链表,完成单个传递(参见本答案的结尾)。这项任务对额外内存的限制是相当有限的,所以我认为最好的方法有点难以理解。
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;
}
(为什么不改变第一部分?) – greybeard
这两个解决方案都是一样的 –
问题是是否允许修改的列表。如果列表不能被修改,即使是暂时的,它也是一个完全不同的水壶。 –