题目描述
输入一个链表,反转链表后,输出新链表的表头。
链表的准备,构建四个节点的单链表,表头是phead:
1 | class Node: |
辅助列表
遍历链表,用一个列表存储遍历到的所有节点,然后从后往前新建反转版本的链表。
1 | class Solution: |
递归的方法翻转链表
记输入链表是L0=phead+L1。既然用递归,则函数的输入是L0的表头phead,输出是新链表的表头,即L0的尾节点。内部调用自身的语句的输入应该是L1,其输出是L1的尾结点,也是L0的尾结点,新的表尾也就是L0的表头指向None。可知新链表的表头从递归的最深层,一路传送到最上层。亦可知,之后需要处理链表与子链表的衔接,即phead.next.next = phead; phead.next = None
,L1的原表头即phead.next要指向phead。:
1 | def reverseL(phead): |
非递归的方法翻转链表
- 递归和非递归两种翻转方法,对输入的检测都是一样的逻辑
if not phead or not phead.next: return phead
- 每次循环,都要拿到前两个节点的指针p和q,循环以q.next的存在性判断是否终止
- 更新p,q和连接时需要一个临时节点指针
1 | def reverseL(phead): |