我接受了采访,他们问我,我不知道答案,我得到了答案

时间:2016-11-30 11:07:13

标签: algorithm linked-list

问题是编写一个伪代码,如果给定的单向链表在两个方向上读取相同,则返回true,否则返回false。此外,我们知道存储在变量n中的列表的大小。预期的解决方案应具有计算复杂度O(n)和存储器复杂度O(1)。

示例:1-> 2-> 3-> 3-> 2-> 1返回true

示例:1-> 2-> 3-> 1->>> 3返回false

1 个答案:

答案 0 :(得分:0)

可以反转单向链接列表,执行单次传递(请参阅本答案的结尾)。对额外内存的限制在这项任务中非常有限,所以我认为最好的方法有点笨拙。

  1. 使用上面提到的算法迭代列表并反转其中心之后的部分(即位置n/2之后)。保存指向列表中最后一个元素的指针 - 您将在步骤2中使用它。
  2. 同时迭代列表从头到尾n/2和反转部分(从n到n/2)。您在两个部分中迭代的元素应该匹配。为此你需要两个变量 - 一个迭代第一部分,一个迭代第二部分(一个记住你已经处理了多少元素)。
  3. 反转列表的后半部分,以便最后不更改列表。
  4. 总的来说,我符合任务的要求。

    反转单向链表的算法是这样的(以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;
    }