专栏持续更新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神,视频题解逐帧观看,看完自己一帧一帧画下来,可以不看视频自己画出来说明真正理解了。