反转部分链表python_单链表反转(python)

本文介绍了两种Python实现单链表反转的方法:迭代和递归。迭代法通过双指针不断移动并交换节点链接实现反转;递归法则利用递归调用来翻转链表,最后返回翻转后的链表头节点。
摘要由CSDN通过智能技术生成

示例:

输入: 1->2->3->4->5->NULL

输出: 5->4->3->2->1->NULL

单向链表定义

单向链表也叫单链表,是链表中最简单的一种形式。每个节点包含两个域,一个信息域(元素域)和一个链接域。链接域存放下一节点的位置(python中的标识),最后一个节点的链接域指向一个空值。

来源:https://blog.csdn.net/m0_49180275/article/details/107508408

1)迭代思想

解题思路

利用双指针不断在head上面向后移动,移动时先移动pre指针,然后cur指针cur.next,pre,cur = pre,cur,cur.next。

要将链表反转,cur 指针表示当前遍历到的节点,pre 指针表示当前节点的前驱节点;中间变量 temp 保存当前节点的后驱节点。

1. 首先将pre指针指向Null,cur指针指向头节点head

2. 当cur!=Null时,执行循环

a. cur.next保存在temp中,防止链表丢失:temp=cur.next

b. 将cur.next指向前驱节点pre:cur.next=pre

此时cur节点中链接域存放的地址指向节点pre,即Null.

c. 将pre向后移动一位,即cur位置:pre=cur

d. 将cur向后移动一位,即temp位置:cur=temp

e. 以此不断循环,每一步循环中,都将原列表中cur.next链接域存放的地址指向其前一个节点,直至cur=Null,pre指向最后一个节点.

3. 返回pre:循环后,原链表中,最后一个节点中指向的下一个节点为原倒数第二个节点,以此类推,原列表的第一个节点指向Null;pre即相当于头节点,返回pre,相当于将原链表反转。

图解流程

faebe90b11c59c290203ba937f9d8f7b.png

来自:https://leetcode-cn.com/problems/reverse-linked-list/solution/tu-jie-liu-cheng-python3die-dai-xiang-jie-by-han-h/

# 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:

pre=None

cur=head

while cur:

temp=cur.next

cur.next=pre

pre=cur

cur=temp

#cur.next,pre,cur = pre,cur,cur.next

return pre

2)递归思想

解题思路

head.next==None:到达尾部节点

head == None:输入空列表,直接返回空列表

递的操作

1.得到尾部节点:p = self.reverseList(head.next)

2.翻转当前节点:head.next.next = head

3.拆掉当前节点的next:head.next = None

为得到翻转后的链表,首先将head指针指向原链表的最后一个节点,并将其存储在节点p中,防止丢失,通过移动head.next指向的节点实现链表的翻转,最后返回p节点,即完成链表翻转。

递归过程:计算机中如何运行递归函数

使用递归时要考虑堆栈的使用情况。

在一个函数中调用一个函数时,计算机需要在进入被调用函数之前跟踪它在当前函数中的位置(以及任何局部变量的值),通过运行时存放在堆栈中来实现(堆栈帧)。在堆栈中存放好了数据后就可以进入被调用的函数。在完成被调用函数之后,他会弹出堆栈顶部元素,以恢复在进行函数调用之前所在的函数。计算机会逐个弹出进行处理。

027037c68f88562ec66818c4a7cbbf89.png

来源:https://leetcode-cn.com/problems/reverse-linked-list/solution/dong-hua-yan-shi-206-fan-zhuan-lian-biao-by-user74/

# 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:

#递归结束条件,如果不存在节点或者只有一个节点时,返回节点本身

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

return head

#处理head节点外的其它节点,将head.next指向链表中最后一个节点,触发函数终止条件,返回p=head.next

#即head为倒数第2个节点,p=head.next为最后一个节点

p=self.reverseList(head.next)

#head的下一个节点指向head,实现翻转

head.next.next=head

#防止循环指向(双重指向)

head.next= None

return p

#return head

return p 返回翻转后的链表

return head,结果为head=1

【递归操作存惑】仅能理解到if语句中return head,head=4,p=5,再执行head.next.next=head,head.next=None

本文地址:https://blog.csdn.net/weixin_45518182/article/details/107645218

希望与广大网友互动??

点此进行留言吧!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值