反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
解法一:迭代法
按顺序遍历链表,对于当前节点,使用临时变量保存其指向的下一个节点,然后将其指向的下一个节点改为其上一个节点,其上一个节点也需要用一个变量进行保存。
### python
# 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:
node = None # 当前节点的上一个节点
cur = head # 当前节点
while cur: # 如果当前节点存在
temp = cur.next # 用一个临时变量保存当前节点的下一个节点
cur.next = node # 更新当前节点的下一个节点
node = cur # 用于更新上一个节点的信息
cur = temp # 当前节点移动到下一个节点
return node
解法二:递归法,假设当前节点后面的所有节点都已经翻转完毕,则对于当前节点需要操作两部分:
- 将当前节点指向的下一个节点指向当前节点;
- 当前节点的下一个节点为None;
# python
# 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:
if not head or not head.next: # 递归停止条件
return head
temp = self.reverseList(head.next) # 当前节点后面的所有节点都已经翻转完毕,返回翻转链表的头结点
head.next.next = head # 当前节点的下一个节点指向当前节点
head.next = None # 当前节点的下一个节点为None
return temp # 返回包括当前节点的翻转链表的头结点