算法入门题:如何反转一个单向链表?
最近在 LeetCode 上面玩
链表类型的题目,所以打算写一篇文章,分享一下在做链表类型题目的心得。
众所周知,玩链表就是玩指针,今天跟大家讲解一个链表的入门题目,如何反转一个单向链表 也是 LeetCode #206 是很热门的一道编程题 LC#206 Reverse Linked List ,如图:
解题理论:
想要反转一个单向链表,除了当前的 head 指针外,我们还另外需要两个辅助指针:
- preNode 用于保存上一个引用的指针
- nextNode 用于保存下一个引用的指针
不管你使用什么编程语言,反转链表的公式都是一样的,主要分为以下四步:
- 将当前 head 引用的 next 引用传递给 nextNode
- 将当前 preNode 引用赋值给 head.next 实现反转(重要)
- 移动 preNode 指针,准备进行下一次反转
- 移动 head 指针,准备进行下一次反转
使用 Java 语言表示的代码如下:
public static ListNode reverseList(ListNode head) { ListNode next, pre = null; while (head != null) { next = head.next;head.next = pre;pre = head;head = next;} return pre; }
因为动态语言允许交叉赋值,所以使用动态语言反转链表就更加的简单,代码如下:
def reverse_list(head) while(head != nil) cur_next, head.next, pre = head.next, pre, head head = cur_next end pre end
图解数据结构
上面代码和文字描述看上去可能不太直观,我们下面通过图文的形式展示一个单向链表是如何被反转的
单向链表的初始状态:
然后我们第一步,开始初始化指针,
ListNode next, pre = null
然后,执行第一步切换指引的代码:
next = head.next;
这时候链表和指针的位置改变如下图:
当执行第二步代码:
head.next = pre;
这时候链表内的指针发生了如下的变化:
这里可以看到 head 引用的 next 指向已经发生的反转变化 ,这一步也是反转链表最重要的一步
后面第三步,第四步就是移动 preNode,head 指针,准备为下一次元素反转做准备了
第三步代码:
pre = head;
如图:
这时候 preNo ad8 de 已经跟 head 头指针指向同一个节点,准备为下一次反转做准备
第四步代码:
head = next;
看到这里大家发现 nextNode 指针其实作用不大,就是帮助 head 同学临时占一个位置的,反转指针主要依靠 preNode 和 head,反转完成后如何:
执行到这里,元素 1 已经被反转过来的,只需要将以上四步执行 N 次,就可以将一个长度为 N 的链表全部反转,所以这套解法的时间复杂度就是 O(n),最后只要提交代码,你就能打败全国 90%的对手,不信的话可以打开 LeetCode 提交一下代码 (●—●)
总结
这道题非常简单,如果你是老手的话就当帮你回顾一下反转链表的解题思路,如果你是新手的话说不定能帮忙打开算法世界的大门,觉得文章不错的话,可以分享给朋友,最后再留一个问题,可以思考一下:
- 为什么最终返回的指针是 preNode, 而不是 head ?
- 左程云_算法与数据结构 — 链表问题 — 04反转单向和双向链表
- 【算法】如何反转一个单链表?如何两两反转?
- 在JAVA中如何创建一个链表(头插法、尾插法)以及反转链表
- 阿里开发者招聘节 | 面试题01:如何实现一个高效的单向链表逆序输出?
- 如何判断一个单向链表是否有环路?
- 如何检查一个单向链表上是否有环?
- 反转一个单向链表
- [总结] 到底如何反转一个链表
- 如何判断一个单向链表是否存在循环的经典方法
- 寻找一个单向链表的中项,如果存在两个则返回前一个,给出算法描述
- 单向链表中,如何在给定节点前快速插入一个节点?
- 如何判断一个单向链表是否有环路
- Java数据结构与算法(剑指offer)——输入一个链表,反转链表后,输出新链表的表头。
- 判断一个单向链表是否有环,算法证明
- 百度笔试算法第二题:如何判断两个单向链表是否有相交,并找出交点
- 一个单向链表,不知道头节点,一个指针指向其中一个节点,问如何删除这个指针指向的节点?
- 面试 居然问如何 反转单向链表~~
- 如何反转单向链表和双向链表( 空间复杂度O(1) )
- 给定一个单向链表,目前已经有一个指针,指向某一个节点(记作A),现在要删除这个节点A,如何操作。
- 《Delphi 算法与数据结构》学习与感悟[6]: 一个简单的"单向链表"