给你单链表的头节点 head
,请你反转链表,并返回反转后的链表。
反转链表是链表里面的一个经典问题,高居牛客网热度第一名,因为它涉及到链表的增删,十分考验被试者的能力,也是很多难题的基础,有两种方法解决链表翻转问题。
方法一:建立虚节点,这样链表反转问题就简化为不断在旧链表中拆下一个节点然后插入到新链表的头部。
class Solution:
def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:
if not head or not head.next:
return head
# 方法1:带虚节点的链表反转,相当于不断在ans后面插入新节点
ans = ListNode(-1)
cur = head
while cur:
next = cur.next
cur.next = ans.next
ans.next = cur
cur = next
return ans.next
方法二:不建立新节点,直接反转,更考验被试者的能力,需要三个指针,head代表新结点,cur代表旧链表,next保证旧链表不丢失。
class Solution:
def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:
if not head or not head.next:
return head
# 方法2:不带虚节点的翻转,需要考虑初始情况
cur = head.next
head.next = None
while cur:
next = cur.next
cur.next = head
head = cur
cur = next
return head