学习目标:
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表
学习内容:
解法一:
思路:使用栈的特性,栈是先进后出的。实现原理就是把链表节点一个个入栈,当全部入栈完之后再一个个出栈,出栈的时候在把出栈的结点串成一个新的链表
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
class Solution:
def reverseList(self, head: ListNode) -> ListNode:
stack = list()
if head == None:
return None
while head is not None:
stack.append(head)
head = head.next
if len(stack) == 0:
return None
node = stack.pop()
result_head = node
while len(stack) > 0:
tmp_node = stack.pop()
node.next =tmp_node
node = node.next
node.next = None
return result_head
解法二:使用双链表求解
双链表求解是把原链表的结点一个个摘掉,每次摘掉的链表都让他成为新的链表的头结点,然后更新新链表。下面以链表1→2→3→4为例画个图来看下
def reverseList(self, head: ListNode) -> ListNode:
new_head= None
while head is not None:
tmp = head.next
head.next = new_head
new_head = head
head = tmp
return new_head
解法三:使用递归法
class Solution:
def reverseList(self, head: ListNode) -> ListNode:
#终止条件
if head is None or head.next is None:
return head
#保存当前节点的下一个结点
next_node = head.next
#从当前节点的下一个结点开始递归调用
obj = Solution()
reverse = obj.reverseList(next_node)
#reverse是反转之后的链表,因为函数reverseList 表示的是对链表的反转,所以反转完之后next肯定
# 是链表reverse的尾结点,然后我们再把当前节点,head挂到next节点的后面就完成了链表的反转。
next_node.next = head
#这里head相当于变成了尾结点,尾结点都是为空的,否则会构成环
head.next = None
return reverse