第一种方法:双指针法
# coding:utf-8 """ Name : NO206.py Author : qlb Contect : 17801044486@163.com Time : 2021/2/3 22:11 Desc: """ # Definition for singly-linked list. # 链表反转 # 解题思路:不断地将当前节点指向当前节点的前一个节点,完成翻转。初始,当前节点为head节点,head的前一个节点为none,不断向后移动,更新当前节点 # 同时也更新当前节点的前一个节点 直到当前节点为none 返回当前节点的前一个节点 此时的前一个节点就是新的头节点 class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next class Solution: def reverseList(self, head: ListNode) -> ListNode: curNode = head preNode = None while curNode is not None: tmpNode = curNode.next #由于当前节点的指向要发生变化 所以提前将当前节点指向的下一个节点保存起来 curNode.next = preNode # 将当前节点的指向更新为当前节点的前一个节点 preNode = curNode # 更新 preNode 向后移动 上一轮的当前节点变为前一个节点 curNode =tmpNode # 更新 curNode 向后移动 上一轮的当前节点指向的下一个节点变为了当前节点 return preNode
第二种方法:递归调用
#递归调用解题思路 #不断调用reverse1方法将当前节点指向当前节点的前一个节点 直到当前节点为None 返回pre # 当前节点初始为head 当前节点的前一个节点初始为None class Solution1: def reverseList(self, head: ListNode) -> ListNode: curNode = head preNode = None return self.reverse1(preNode,curNode) def reverse1(self,pre,cur): if cur is None: return pre tmpNode = cur.next cur.next = pre newPre = cur newCur = tmpNode return self.reverse1(newPre,newCur)