反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
解法一:头插法
增加哨兵节点,每次迭代先备份head.next,然后修改head.next,最后修改dummy.next。
class Solution:def reverseList(self, head: ListNode) -> ListNode:dummy = ListNode(0)while head:nxt = head.nexthead.next = dummy.nextdummy.next = headhead = nxtreturn dummy.next
解法二:双指针法
使用pre和cur指向相邻的两个节点,将pre->cur改成pre<-cur,迭代至cur == None,此时pre指向原链表的最后一个节点,即新的表头。
class Solution:def reverseList(self, head: ListNode) -> ListNode:pre, cur = None, headwhile cur:tmp = cur.nextcur.next = prepre, cur = cur, tmpreturn pre
解法三:递归
子问题:head指向一个已经反转完成的链表尾部元素,将head与尾部元素进行反转
退出条件:链表为空或仅有一个元素
class Solution:def reverseList(self, head: ListNode) -> ListNode:if not head or not head.next:return headnew_head = self.reverseList(head.next)head.next.next = headhead.next = Nonereturn new_head
