原题
Reverse a singly linked list.
Example:
Input: 1->2->3->4->5->NULL
Output: 5->4->3->2->1->NULL
Follow up:
A linked list can be reversed either iteratively or recursively. Could you implement both?
解法1
遍历法, 先遍历链表, 将链表转化为list, 然后反转list, 将list转化为链表.
Time: 2*O(n)
Space: O(n)
代码
class Solution:
def reverseList(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
l = self.getList(head)
l.reverse()
dummy = p = ListNode(0)
for val in l:
p.next = ListNode(val)
p = p.next
return dummy.next
def getList(self, head):
l = []
while head:
l.append(head.val)
head = head.next
return l
解法2
递归. Base case是当head是空或者是单独节点时, 直接返回原head. 当我们移动到最后一个Node以后, 将这个Node定义为我们新的head, 取名new_head. 我们从new_head开始重复性的往前更改指针的方向.
Time: O(n)
Space: O(1)
代码
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def reverseList(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
# base case
if not head or not head.next:
return head
new_head = self.reverseList(head.next)
next_node = head.next
next_node.next = head
head.next = None
return new_head
解法3
迭代法
代码
# 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':
prev = None
while head:
curr = head
head = head.next
curr.next = prev
prev = curr
return prev