回文链表 反转链表
最近在实习比较忙,更文数量大减,今晚忙里偷闲,做两道简单的算法题
回文链表
给你一个单链表的头节点
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;
};