题目描述
反转一个单链表
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
思路
通过指针的赋值和移动把链表反转
链表结点结构
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
代码
# iterative
class Solution:
def reverseList(self, head: ListNode) -> ListNode:
cur, prev = head, None
while cur:
cur.next, prev, cur = prev, cur, cur.next
return prev
# recursive
class Solution:
def reverseList(self, head: ListNode) -> ListNode:
return self._reverse(head)
def _reverse(self, node, prev=None):
if not node:
return prev
_next = node.next
node.next = prev
return self._reverse(_next, node)
代码解释
迭代
1.正常情况下需要三个指针prev
, curr
, next
去完成链表的反转,但这里利用python多元赋值的机制
2.需要注意的是cur
作为ListNode
的对象,在多元赋值里把cur
放在cur.next
前面则会影响到cur.next
变成赋值后cur
的next
属性而不是赋值前的cur
递归
1._next
指向当前结点的下一个结点,然后把当前结点的next
域指向其前驱结点
2.在当前结点的next
域为空的情况下返回当前结点指针作为链表的头指针
复杂度分析
时间复杂度
迭代
遍历所有结点需要O(n)的时间复杂度
递归
递归整个链表需要O(n)的时间复杂度
空间复杂度
迭代
因为只用到了两个结点指针,因此空间复杂度是O(1)
递归
递归压入栈中需要O(n)的空间复杂度