算法---反转链表

“ 又到了和大家分享算法的时间了,今天涉及到的话题是和链表有关系的,如果不了解链表的同学可以去看看我之前的文章,今日分享的算法题是leetcode206反转链表。”

数据结构与算法之单向链表

1. 题目描述

反转链表题目如下所示,其实就是将输入的链表进行一个反转,这也是算法中常考的一道题,小伙伴此时你想想如果你面试拿到这道题该如何思考和解决呢?
题目描述
反转链表题目描述图

2. 题解思路

在这里我说一下自己的解题思路,当然如果你有更好的思路欢迎在下方留言,让我们也见识一下更好的方法。老规矩,先看看下方画的图,然后再配合解析来进行分析:
题解思路
解析步骤图

解析思路步骤图
解析思路步骤图

关于交换的过程,其实可以联想到之前在大学才开始学习编程时的一个题目,交换a和b两个数的位置并打印,其实思路就是定义一个临时的变量temp先存储a,然后再将b的值赋值给a,最后把temp的值赋值给b即可,而在这道题中链表的交换也是同样的思想。

1
2
3
4
5
let a = 1, b = 2, temp;
// 交换a和b的值,其实就是运用到temp临时变量存储
temp = a;
a = b;
b = temp;

如果你对此还有疑问的话,欢迎在下方留言,我会在看到后给你进行一个解答。

3. 代码实现

在了解了上面的思路之后,你看看能不能先尝试自己编写,如果还有问题的话,再来看看下面的代码。如果真的理解了的话,会发现实现起来也不是自己想象中的那么难,代码也就那几行。具体代码如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} head
* @return {ListNode}
*/
var reverseList = function(head) {
let curr = null;
let pre = head;
while (pre) {
let temp = pre.next;
pre.next = curr;
curr = pre;
pre = temp;
}
return curr;
};

如果你觉得对你有帮助的话,不妨来个三连再走。