回文链表 反转链表

121 阅读2分钟

回文链表 反转链表

最近在实习比较忙,更文数量大减,今晚忙里偷闲,做两道简单的算法题

回文链表

给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。

回文是面试高频概念,回文字符串如121,123321等

鄙人不才,采用了最简单的解法

先用数组存储链表的val值,再从两边往中间比较,回文满足左右对称,一旦不满足条件,立刻返回false,若遍历完数组,还未return,说明该链表是一个回文链表,return true

var isPalindrome = function (head) {
  const tempArr = [];
  while (head !== null) {
    tempArr.push(head.val);
    head = head.next ? head.next : null;
  }
  for (let i = 0; i < tempArr.length; i++) {
    if (tempArr[i] !== tempArr[tempArr.length - 1 - i]) {
      return false;
    }
  }
  return true;
};

反转链表

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

反转链表是面试高频,但这是一道极为简单的题,一定要熟练掌握,否则会给面试官留下不好的印象。

注意:需要暂存当前结点的下一个,因为当你修改了当前结点的 next 指向 pre 时,如果没有保存之前的 cur.next 就会丢失这个指向关系,从而使得链表断开。

总体步骤就是:暂存 -> 反转(回指)-> 迭代(更新 cur 和 pre,cur 变成 pre,刚刚暂存的 temp 变成了 cur)

/**
 * @param {ListNode} head
 * @return {ListNode}
 */
var reverseList = function (head) {
  let cur = head;
  let pre = null;
  while (cur !== null) {
    // 暂存当前结点的下一个
    temp = cur.next;
    // 上面存完便可以修改当前结点的next指向pre,pre初始值为null
    cur.next = pre;
    // 修改pre和cur,相当于指针移动
    pre = cur;
    cur = temp;
  }
  // 这里千万要注意,while终止时cur===null,pre才是反转链表的头结点
  return pre;
};