题目
Leetcode 206: 反转链表
难度: 简单
题目分析:这道题能充分体现链表相对list的优势,把链表反转,只需要调整链表指向,而不需要移动元素。
建立一个新链表,每次从旧链表拿下一个元素,插入新链表的头,这个操作的代价均是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: ListNode) -> ListNode:
if not head or not head.next: # 空或一个元素
return head
p = None
while head is not None:
new_head = head
head = head.next # 摘下头结点
new_head.next = p # 新列表接上
p = new_head
return p
运行结果:
解法二:递归
class Solution:
def reverseList(self, head: ListNode) -> ListNode:
# 递归
if not head or not head.next:
return head
new_list = self.reverseList(head.next) # 除第一个元素,后面都排好
head.next.next = head # head.next 是返回来的列表最后一个元素,接上head,就能排好
head.next = None # 防止形成环
return new_list
运行结果
易错点分析:
# 正确写法:
new_list = self.reverseList(head.next)
## 错误写法:
head.next = self.reverseList(head.next)
# 这个写法,会抹去 head.next的信息,这样我们就没法在O(1)的时间,找到倒数第二个元素了。
最后,记得 head 指向的点,已经变成最后一个点,记得把 head.next 变成 None。