No206. 反转链表
题目
反转一个单链表。
示例
- 输入: 1->2->3->4->5->NULL
- 输出: 5->4->3->2->1->NULL
进阶
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
思路1
- 第一次遍历,存数据;
- 第二次遍历,改数据;
解题代码(Python3)
class Solution:
def reverseList(self, head: ListNode) -> ListNode:
result = []
p = head
while p:
result.append(p.val)
p = p.next
p = head
i = 0
while p:
p.val = result[-1-i]
i += 1
p = p.next
return head
复杂度分析:
- 时间复杂度 O(n)
- 空间复杂度 O(n) 需要额外的空间储存元素
运行结果
思路2
迭代,构造类双向列表改变指针方向达成目的:
- 用pNext存储当前结点的下一个结点
- 改变head.next为prev,prev为head,head为pNext
解题代码(Python3)
class Solution:
def reverseList(self, head: ListNode) -> ListNode:
prev = None
while head:
pNext = head.next
head.next,prev,head = prev,head,pNext
return prev
复杂度分析
- 时间复杂度 O(n)
- 空间复杂度 O(1)