专栏持续更新50道算法题,都是大厂高频算法题,建议关注。
文章目录
- 解法参考链接
- 题目
- 解法一 双指针
- 解法二 递归
- 解法三 妖魔化的双指针
- 总结
解法参考链接
题目
解法一 双指针
- 定义两个指针: pre 和 cur。pre 在前 cur 在后。
- 每次让 pre的 next 指向 cur,实现一次局部反转
- 局部反转完成之后, pre 和 cur 同时往前移动一个位置
- 循环上述过程,直至 pre 到达链表尾部
class Solution {
public ListNode reverseList(ListNode head) {
// 如果初始化用这个,输出就是543210,多了一个0
// ListNode pre = new ListNode();
ListNode pre = null;
ListNode cur = head;
while (cur != null) {
ListNode temp = cur.next;
cur.next = pre;
pre = cur;
cur = temp;
}
return pre;
}
}
解法二 递归
class Solution {
public ListNode reverseList(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode ret = reverseList(head.next);
// 两次next需要理解一下:head.next实际代表的就是最后一个节点,看方法的入参
head.next.next = head;
head.next = null;
return ret;
}
}
解法三 妖魔化的双指针
class Solution {
public ListNode reverseList(ListNode head) {
if (head == null) { return null; }
ListNode cur = head;
while (head.next != null) {
ListNode temp = head.next.next;
head.next.next = cur;
cur = head.next;
head.next = temp;
}
return cur;
}
}
总结
反转链表在面试时非常高频,解法主要掌握解法一即可,要会写还要会说,面试官有时会问思路的。对于没刷过算法的建议看下文章开头的视频题解。作者K神,视频题解逐帧观看,看完自己一帧一帧画下来,可以不看视频自己画出来说明真正理解了。