最近在 LeetCode 上面玩 链表
类型的题目,因此打算写一篇文章,分享一下在作链表类型题目的心得。java
众所周知,玩链表就是玩指针,今天跟你们讲解一个链表的入门题目,如何反转一个单向链表 也是 LeetCode #206 是很热门的一道编程题 LC#206 Reverse Linked List ,如图:算法
想要反转一个单向链表,除了当前的 head 指针外,咱们还另外须要两个辅助指针:编程
无论你使用什么编程语言,反转链表的公式都是同样的,主要分为如下四步:ruby
使用 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
上面代码和文字描述看上去可能不太直观,咱们下面经过图文的形式展现一个单向链表是如何被反转的指针
单向链表的初始状态:code
而后咱们第一步,开始初始化指针,blog
ListNode next, pre = null
而后,执行第一步切换指引的代码:leetcode
next = head.next;
这时候链表和指针的位置改变以下图:
当执行第二步代码:
head.next = pre;
这时候链表内的指针发生了以下的变化:
这里能够看到 head 引用的 next 指向已经发生的反转变化 ,这一步也是反转链表最重要的一步
后面第三步,第四步就是移动 preNode,head 指针,准备为下一次元素反转作准备了
第三步代码:
pre = head;
如图:
这时候 preNode 已经跟 head 头指针指向同一个节点,准备为下一次反转作准备
第四步代码:
head = next;
看到这里你们发现 nextNode 指针其实做用不大,就是帮助 head 同窗临时占一个位置的,反转指针主要依靠 preNode 和 head,反转完成后如何:
执行到这里,元素 1 已经被反转过来的,只须要将以上四步执行 N 次,就能够将一个长度为 N 的链表所有反转,因此这套解法的时间复杂度就是 O(n),最后只要提交代码,你就能战胜全国 90%的对手,不信的话能够打开 LeetCode 提交一下代码 (●—●)
这道题很是简单,若是你是老手的话就当帮你回顾一下反转链表的解题思路,若是你是新手的话说不定能帮忙打开算法世界的大门,以为文章不错的话,能够分享给朋友,最后再留一个问题,能够思考一下: