递归删除单链表中所有值为x的元素_单链表逆序

b955279743c55d47ba42f9fd9e1d9743.png

代码有解释,可能一开始看不到,更着动手多敲几遍就能掌握了。加油。

题目描述:

给定一个带头结点的单链表,请将其逆序。即如果单链表原来为head->1->2->3->4->5->6->7,那么逆序后变为head->7->6->5->4->3->2->1。

  • 由于单链表与数组不同, 中每个结点的地址都存储在其前驱结点的指针域中, 因此,对单链表中任何 个结点的访问只能从链表的头指针开始进行遍历。在对链表的操作 过程中,需要特别注意在修改结点指针域的时候,记录下后继结点的地址,否 会丢失后继结点。

先定义好链表结构

# -*- coding: utf-8 -*-

一、递归逆序

思路:

1、首先将1 -> 2 -> 3 ->4变成1 -> 4-> 3 -> 2(其中2 -> 3 ->4变成4-> 3 -> 2,采用递归方式实现)

2、再将head头节点1移到尾巴,作为尾结点,由于上一个尾结点2,是原先的head.next,此时将2的next指针指向头节点,即head.next.next = head,然后尾结点指向空,即head.next = None

3248fab86f669f927bfcf216dcac32eb.png

3、特殊情况:头节点为空或者只有1个节点

"""

算法性能分析:

由于递归法也只需要对链表进行 次遍历,因此,算法的时间复杂度也为 O(N) ,其中,N为链表的长度。

  • 递归法的主要优点是:思路比较直观,容易理解,而且也不需要保存前驱 结点的地址
  • 缺点是:算法实现的难度较大,此外,由于递归法需要不断地调用自己,需要 额外的压技与弹枝操作,因此, 与方法 相比性能会有所 降。

二、就地逆序

d3c7e51c089da113c84176a930b54747.png

移动:第1次指针操作,将当前节点指针cur.next值临时保存到nex,即nex = cur.next, 第2次指针操作,将当前的指针cur.next指向其前一个节点pre, 即cur.next = pre,这样就实现了对单个节点的操作。

操作节点的变量移动,pre结点后移:pre_node = cur_node ,cur指向下一个操作节点,即cur = nex,这样通过while循环即可实现对每个节点操作。

特殊情况:链表为空链表、链表为单节点,直接返回即可,无需逆序操作

"""

三、插入逆序

直假定原链表为head->1->2->3->4->5->6->7,在遍历到2的时候,将其插入到头结点后,链表变为head->2->1->3->4->5->6->7,同理将后序遍历到的所有结点都插入到头结点head后,就可以实现链表的逆序。实现代码如下:

"""

测试

# 当然,也许还有别的方法,比如建一个辅助的链表

参考:

《python程序员宝典》

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值