day4-2022.10.27
题目信息来源:
作者:Krahets
链接:https://leetcode.cn/leetbook/read/illustration-of-algorithm
来源:力扣(LeetCode)
剑指 Offer 24. 反转链表
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
题解:指针法
用pre和next暂存前一节点和后一节点,再断开连接,建立新的连接
# 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:
self.pre = None
self.next = None
while head:
self.next = head.next
head.next = self.pre
self.pre = head
head = self.next
return self.pre
题解:递归法
- 递归就是递归到next为0的节点,然后返回,将之间的节点的next改为节点的pre,所以考虑构造一个函数,传递节点和节点的pre,递归结果,依次返回,修改节点的next
- 但是这样会存在一个问题,依次返回后,新的倒序列表的头节点会消失,故需要将头节点在每次递归回去的都需要传递,就里的head,它从最开始的now=none时返回的pre,之后一直没有变过
- 递归法的next修改从最后面开始修改,和指针法相比,不需要一个暂存的next来保留下一个head,或者暂存一个pre来保留前一个head
class Solution:
def trans(self, now:ListNode, pre:ListNode) -> ListNode:
if now==None:return pre # 递归的终止条件,一般写在最前面,这里返回了头节点
head = self.trans(now.next, now)# 递归,保留头节点
now.next = pre # 递归到最后,返回时才开始修改next为前一节点
return head #继续传递头节点
def reverseList(self, head: ListNode) -> ListNode:
return self.trans(head, None)
一个错误的递归例子,丢失了头节点
class Solution:
def trans(self, now:ListNode, pre:ListNode) -> ListNode:
if now==None:return pre
now = self.trans(now.next, now)
now.next = pre
return pre
def reverseList(self, head: ListNode) -> ListNode:
return self.trans(head, None)