翻转链表python递归_leetcode 206. 反转链表(python)

题解: 本题有两种实现方法,分别是迭代法和递归法;

方法一:迭代法:

利用双指针进行实现 两个指针分别是pre, curr; 再加一个临时变量temp;pre初始化为None;curr初始化为头结点head;

然后令temp=curr.next(即保存当前结点的下一个结点,以便后面使用);

curr.next = pre(建立当前结点和它前面结点之间的连接关系,实现结点之间方向的反转);

pre = curr(往前移动pre);

curr = temp(往前移动curr);

最后curr为None,返回pre即为最后一个结点。

图解如下所示:

第一次迭代:

第二次迭代:

代码如下:

# Definition for singly-linked list.

# class ListNode:

# def __init__(self, x):

# self.val = x

# self.next = None

class Solution:

def reverseList(self, head):

pre = ListNode(None)

curr = head

tmp = ListNode(None)

while curr:

tmp = curr.next

curr.next = pre

pre = curr

curr = tmp

return pre

方法二:递归法

递归终止条件:

当前结点为空(适用于链表为空的情况),或者当前结点的下一个结点为空(链表不为空的情况);

递归过程如下所示:

初始链表:

1-->2-->3-->4-->5-->None

1. 先遍历到链表的末尾,

head = 1 ......... head.next=2

head = 2 ......... head.next=3

head = 3 ......... head.next=4

head = 4 ......... head.next=5

head = 5 ......... head.next= None

2. 递归返回一

此时遇到递归终止条件,进行返回,返回当前的head 为5,即cur=5;此时head.next.next为Null指向的结点我们赋值为head,首先了null指向head结点(5)的效果。 如下图所示:

3. 递归返回二

cur值为5,head此时为4,head.next为结点5, 因此head.next.next = head就实现了下述效果

为了防止出现环路,我们需要设置head.next = None。

后面的递归返回如上述一次进行,最后head为1。

代码如下:

class Solution:

def reverseList(self, head):

if head == None or head.next == None:

return head

cur = reverseList(head.next)

head.next.next = head

head.next = None

return cur

总结:

对于一个给定的链表,我们首先需要遍历到链表的尾端,例如对于[1,2,3,4,5],递归遍历到最后返回5; 即当前的head值为5,head.next 为None,head.next.next为None所指向的结点, head.next.next赋值为结点5(head.next.next = head),实现了链表方向的反向连接,然后进行递归返回; 返回后cur仍为5,head就变为了4,此时head.next = 5, head.next.next就是结点5的指针指向的结点;因此我们把head.next.next 赋值为head,就实现了结点5到结点4的反向连接。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值