[leetcode初级算法]反转链表
Mkdir700 • 2020 年 03 月 26 日
Loading...
## 题目
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
----------
## 迭代
### 算法
`1->2->3->4->5` 变成 `5->4->3->2->1`
目的就是指针都反过来指
我们知道,在单链表中遍历,只能往前,不能回头
先解决一个小问题,目前是`1->2->3`,我要让`1
我们要让`节点2`的next区域指向`1`,但是此时又没有`节点1`的地址
所以,我们可以定义两个变量,一前一后,`pre` 负责记录 待操作节点之前的节点
`cur` 用来记录当前节点
### 动图演示
![无图片描述][1]
### 代码
```Python
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def reverseList(self, head: ListNode) -> ListNode:
next_node = None
cur = head
while cur:
# 保存当前节点的下一个节点
temp = cur.next
# 当前节点的指针域指向上一个节点
cur.next = pre
# 将pre游标移动到现在节点的位置(记录当前节点地址)
pre = cur
# 移动当前节点到下一位
cur = next_node
return pre
```
## 递归
### 算法
这个解法,我是看这里
https://leetcode-cn.com/problems/reverse-linked-list/solution/dong-hua-yan-shi-206-fan-zhuan-lian-biao-by-user74/
我对递归 动态规划 一直都头疼,但是没办法得学呀!
递归,这个操作过程是自底向上的
这个过程可以看下方的动图
我们需要一直往下(一直调用自身),直到无法再往下的时候——>处理数据——>层层回溯
那么什么时候?让程序知道,哦!该往回走了。 而不是傻傻的一直调用自身。
这就涉及到递归关键点`停止条件`,可以理解成循环停止的条件吧
数据处理完了,是吧,那么还应当主动`return`返回到上一层
终上所述:
1. 终止条件是当前节点或者下一个节点==null
2. 在函数内部,改变节点的指向,也就是 head 的下一个节点指向 head 递归函数那句
关于本题,要使`7——>5`,可以依靠这行代码
```
head.next.next = head
```
![无图片描述][2]
就是要让`7节点的指针域`保存`5节点的地址`
### 动图演示
![无图片描述][3]
### 代码
```Python
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def reverseList(self, head: ListNode) -> ListNode:
if head is None or head.next is None:
return head
# cur是最后一个节点,也将反转之后链表的第一个节点
cur = self.reverseList(head.next)
# 这一步在上面已经详细解释过了
head.next.next = head
# head.next=node又是怎么呢?
head.next = None
return cur
```
接着来看`head.next = None` 这一步是什么意思?
可以在看下图,当我们做完一次反转操作后,`head`的指针域,还是指向原来的
所以,我们应该把这个链给断开
![无图片描述][4]
[1]: http://assets.z2blog.com//2020/03/26/38b8c0326110449.jif
[2]: http://assets.z2blog.com/2020/03/26/f12a10326112918.png
[3]: http://assets.z2blog.com//2020/03/26/a3a400326110837.jif
[4]: http://assets.z2blog.com/2020/03/26/b45b10326114551.png