反转链表并不是很难,但由于我太久没刷题全忘了。
我第一次写的代码:

def ReverseList(self , head: ListNode) -> ListNode:
	if head == None:			# 检查输入是否为空
		return head
        
	p, q = head, head.next		# 判断是否只有一个结点
	if q == None:				# 如果只有一个结点,则返回该结点
		return head
        
	s = head.next.next			# 判断是否只有两个结点
	if s == None:				# 如果只有两个结点,则反转两个结点并返回
		p.next = None
		q.next = p
		return q
        
	p.next = None				# 如果结点大于等于3,通过循环反转链表
	while q != None:			# 具体思想:用s保存q后的结点,将p赋给q.next
		q.next = p				# 此时,q与原来的链表断开了,但是有s记录断开的位置
		p = q					# 让p = q,使p始终作为反转后的链表的表头
		q = s					# q = s,使q回到旧链表的表头
								# 当s.next = None时,s此时位于表尾
		if s != None:			# 当s = None时,q在表尾,但尚未结束循环,所以需要判断s
			s = s.next			# 最终,q = None时结束循环,新链表表头为p
                
	return p

我写完后感叹:简单是挺简单的,就是我给整复杂了。
然后我准备玩点花的。
于是就有了下面的代码:

def ReverseList(self , head: ListNode) -> ListNode:
	p = head
	if p == None:				# 老样子,先判断链表是否为空
		return p
        
	head = None
	while p != None:
		q = ListNode(p.val)		# 然后!新建结点并用头插法新建列表
		q.next = head			# 我可太聪明辣
		head = q
		p = p.next
        
	return head

虽然是对的,但我还是觉得还能再优化优化。
毕竟,这种解决方法我是真的拿不出手。
随后我去翻看题解和讨论,我大惊失色,原来我不只把反转链表整复杂了一点。
在看完双链表求解之后我修改了自己的代码。

def ReverseList(self , head: ListNode) -> ListNode:
	p = head				# p作为原链表的头
	head = None				# head作为新链表的头
	while p != None:		# 在原链表还存在结点时
		q = p.next			# 使用q保存p.next
		p.next = head		# 然后断开p与原链表,将p作为新链表的表头
		head = p			# 使head成为新链表的表头
		p = q				# 使p成为原链表表头

	return head

嗯,真的,简单了不止一点,也简洁了不止一点。
今天又是大聪明的一天捏。