zoukankan      html  css  js  c++  java
  • 单链表翻转的三个方法

      当然这个算不上是困难的算法,面试考的也不少,实现起来可以有多种方法,但是你能写出最优秀的吗?

      大概有这几种:

        reverse1.新建一个单链表把原链表的内容逐个头插法插入新链表中.从而实现了链表的翻转.

        reverse2.新建一个数组把原链表的内容copy到数组和新链表中.从而实现了链表的翻转.

        reverse3.一次遍历单链表,原地将原链表翻转

      评注:

      reverse1 在实现的时候,也只是遍历了一次原链表,但是却要新创建一个链表,来保存原链表的反转内容,相当于原链表的副本.虽然时间复杂度上为O(n),但却浪费了空间,而且还有链表的头插入,带来指针的移动额外的开支.

      reverse2与reverse1 一样在时间复杂度上为O(n),但是翻转的内容是用Node数组保存,这样失去了链表的实质,再者,链表的长度本应是不固定的.所以要适应不同的链表,数组的长度使不能确定的.因此,要使用此方法需要明确知道单链表的长度.否则,在做反序输出数组时,可能造成数组下标越界.

      reverse3与前两者相比,也是遍历一次原链表.但是它在遍历的同时改变了原链表的指针方向,是原链表的节点改变成指向原来相反的地方.这样做就达到了翻转的目的.而且时间复杂度依然是O(n).且不需要另外开辟新的空间来存放新的链表.这样做的好处在不改变原链表节点存放数据内容外,而且没有对数据的操作,只是对指针的操作.避免了改写原链表存放的数据.

  • 相关阅读:
    FireDAC的数据库的FDConnect
    Readers and Writers JSON Framework(2)
    JSON Objects Framework(1)
    SQLServer 临时表的使用
    客户重复需要检查CRM客户
    采购订单下推付款申请单获取组织业务关系
    采购订单跨组织生成销售订单,没得选组织的问题
    销售合同缓存问题
    BOS中给基础资料赋值
    辅助属性值列表功能的缺点
  • 原文地址:https://www.cnblogs.com/zhaoyl/p/2696711.html
Copyright © 2011-2022 走看看