今天写一篇有关『单链表』的经典面试题-反转链表,本人在百度
字节
的面试中遇到过,题目属于easy
的级别,虽然简单,但是更需要掌握😊
题目描述:
输入一个链表,反转链表后,输出新链表的表头。
输入:{1, 2, 3}
返回:{3, 2, 1}
思路分析
链表反转的核心在于头插法,掌握头插法就掌握了这道题目
另外要注意的就是看题目是否要求不能破坏原链表,如果要求不能破坏,那么要申请新的空间
可以借助额外的空间来实现,初始化一个值为-1的头指针,然后遍历链表,采用头插法完成链表反转
有的面试官比较严格,会要求不借助额外的空间,那么就采用变量记录原链表头的位置就可以了
AC代码实现
-
借助额外的链表头实现
function ListNode(x){
this.val = x;
this.next = null;
}
function ReverseList(pHead)
{
// write code here
if (pHead == null || pHead.next == null) {
return pHead;
}
let head = new ListNode(-1);
let p = pHead, pNxt;
while (p != null) {
pNxt = p.next;
p.next = head.next;
head.next = p;
p = pNxt;
}
return head.next;
}
-
不借助额外链表头,在原链表上实现反转
function ReverseList(pHead)
{
// write code here
if (pHead == null || pHead.next == null) {
return pHead;
}
let head = pHead, pHeadNxt = pHead.next;
pHead = pHeadNxt;
head.next = null;
while (pHead != null) {
pHeadNxt = pHead.next;
pHead.next = head;
head = pHead;
pHead = pHeadNxt;
}
return head;
}
总结
链表是面试中常考的算法题,对于链表的考察,反转链表是常见的题目。对于常见算法题,要熟悉解题思路,掌握关键点,这样在面试中才会有把握。
链表反转还可以通过递归的方式来实现,代码比较简洁,有兴趣的可以自己实现一下。
如果这篇文章对你有帮助,就
点赞
关注
吧
本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情