如何在时间复杂度为O(n)空间复杂度为O(1)的情况下完成链表的逆置
问题如题目,首先分析,链表的反转的空间复杂度如果为常数级,那么不可能完成从堆中申请数据来完成链表的反转工作,所以问题就转化为了如何将原链表修改/拆解为逆置的链表:
函数形式假定如下 void Inverse(List*&head)//////修改原链表为逆置
第一种办法最简单,就是在创建一个局部变量 List*tail 作为产生的新链表的“尾部”,再设置一个“游标”指针用于指向当前正在访问的链表单元,然后按顺序循环遍历链表,在遍历的同时将正在访问的链表单元添加到新链表尾部的“tail”指针前面,依此循环。
///////Decrease and Conquer
void Inverse(List*&head){
List*tail=nullptr,now=head;
List*tmpNext=nullptr;
while(tmpNext!=nullptr){
tmpNext=now->next;///// Temporary Saving the Next Pointer Value
now->next=tail;
tail=now;
}
head= tail; ///// Tail is the head of the inversed LinkList///
}
第二种方法是通过交换的方法来实现链表的逆序
首先我们需要一个子函数 空间复杂度为O(1)
template<typename T>
void swap(T&vl,T&vr){
T tmp=vl;
vl=vr;
vr=tmp;
}
其后我们需要考虑的是交换的步骤应当如何设计,在本种方案中的关键程序步为交换操作不妨用一个有代表性的串作为例子进行思考
算法的思路依然为 Decrease and Conquer
1->2->3->4 ///////原串
2->1->3->4 ///////第一次交换之后
3->2->1->4 ////////第二次交换之后
4->3->2->1 ///////第三次交换之后完成了整个的逆序过程
所以我们的算法是要做的两件事是 1. 已逆序完成的串的后移 2. 跨度递增的一个交换
template<typename T>
bool strPush(List<T>*&head,int len){
////// to Push the string (len) digits
////// from pos in arr and let last element assigned in the first position
List<T>*temp=head;
for(int i=0;i<iLen;i++){
temp=temp->next;
if(temp==nullptr)return false;
}
List<T>*tmp2=temp->next;
temp->next=head;
head->next=tmp2;
head=head->next;
/////////Complete
return true;
}
void Inverse2(List*head){
int iLen =1;///// Initialized to be 1
while(true){
if(strPush(head,iLen))iLen++;
else break;
}
}
如何在时间复杂度为O(n)空间复杂度为O(1)的情况下完成链表的逆置的更多相关文章
- 【编程题目】如何对n个数进行排序,要求时间复杂度O(n),空间复杂度O(1)
转自:http://blog.csdn.net/vast_sea/article/details/8167968 看上去似乎任何已知的算法都无法做到,如果谁做到了,那么所有的排序方法:QuickSor ...
- 如何对n个数进行排序,要求时间复杂度O(n),空间复杂度O(1)
看上去似乎任何已知的算法都无法做到,如果谁做到了,那么所有的排序方法:QuickSort,ShellSort,HeapSort,BubbleSort等等等等,都可以扔掉了,还要这些算法干吗阿,呵呵.不 ...
- [LeetCode] Candy (分糖果),时间复杂度O(n),空间复杂度为O(1),且只需遍历一次的实现
[LeetCode] Candy (分糖果),时间复杂度O(n),空间复杂度为O(1),且只需遍历一次的实现 原题: There are N children standing in a line. ...
- 在一个数组中,除了两个数外,其余数都是两两成对出现,找出这两个数,要求时间复杂度O(n),空间复杂度O(1)
题目:在一个数组中,除了两个数外,其余数都是两两成对出现,找出这两个数,要求时间复杂度O(n),空间复杂度O(1) 分析:这道题考察位操作:异或(^),按位与(&),移位操作(>> ...
- 冒泡法的算法最佳情况下的时间复杂度为什么是O(n)
我在许多书本上看到冒泡排序的最佳时间复杂度是O(n),即是在序列本来就是正序的情况下. 但我一直不明白这是怎么算出来的,因此通过阅读<算法导论-第2版>的2.2节,使用对插入排序最佳时间复 ...
- 斐波拉契数列加强版——时间复杂度O(1),空间复杂度O(1)
对于斐波拉契经典问题,我们都非常熟悉,通过递推公式F(n) = F(n - ) + F(n - ),我们可以在线性时间内求出第n项F(n),现在考虑斐波拉契的加强版,我们要求的项数n的范围为int范围 ...
- 一道时间复杂度为O(N)空间复杂度为O(1)的排序问题
题目:对1, 2, ... , n的一个无序数组,排序,要求时间复杂度为O(N),空间复杂度为O(1). 思路:该题利用数组元素和数组下标相差1的关系,Java代码如下: import java.ut ...
- 如何对n个大小都小于100的整数进行排序,要求时间复杂度O(n),空间复杂度O(1)。
提示:hash表 #include <iostream> using namespace std; #define N 100 #define RANGE 100 int* getRand ...
- 时间复杂度O(n)与空间复杂度O(1)
把输入规模看成x轴,所花时间/空间看成y轴.O(n)就是 y = x, y随x的增长而线性增长.一条斜线O(1)就是 y = 1,不管x如何变,y不变.一条与x平行的线 举个简单的例子,要从0加到n, ...
随机推荐
- 总结 Eclipse 编程常用的快捷键
Eclipse 常用快捷键Eclipse的编辑功能非常强大,掌握了Eclipse快捷键功能,能够大大提高开发效率.Eclipse中有如下一些和编辑相关的快捷键. 1. [ALT+/] 此快捷键为用户编 ...
- 做IT这几年,我整理了这些干货想要送给你!
没有一条路是容易的,特别是转行计算机这条路. 松哥接触过很多转行做开发的小伙伴,我了解到很多转行人的不容易,记得松哥大二时刚刚决定转行计算机,完全不知道这些东西到底应该怎么学,每天就是抱着书啃,书倒是 ...
- Java实验--关于课上找“水王”问题分析
问题的表述就是说有那么一个人,他在一个论坛上发帖,然后每贴必回,自己也发帖.那么这个人在发帖的数目上就超过了整个论坛的帖子数目的一半以上. 我对这个问题一开始的思路是,用SQL语句获取整个列表中的数据 ...
- golang实现dns域名解析(一)
本文将详细讲解如何用go语言一步一步实现dns域名解析的过程,并简单介绍点dns有关的知识,直接开始正题吧. 首先我们要了解dns解析的过程,没有了解的请看这里DNS入门(转)很详细.扫盲结束后,我们 ...
- openfire Android学习(五)------连接断开重连
首先要创建连接监听器,用来监听连接状态,这里我写了一个类 继承了ConnectionListener,重写了里面5个方法,最重要的两个方法connectionClosed()和connectionCl ...
- 26个高效工作的小技巧 z
1.时间常有,时间优先. 2.时间总会有的:每天只计划4-5 小时真正的工作. 3.当你在状态时,就多干点:不然就好好休息:有时候会连着几天不是工作状态,有时在工作状态时却又能天天忙活 12 小时,这 ...
- 如何给redis设置密码
如何给redis设置密码 学习了:https://blog.csdn.net/qq_35357001/article/details/56835919
- 一个Netfilter nf_conntrack流表查找的优化-为conntrack添加一个per cpu cache
独悲须要忍受.快乐须要分享对Linux协议栈多次perf的结果,我无法忍受conntrack的性能,然而它的功能是如此强大,以至于我无法对其割舍,我想自己实现一个高速流表.可是我不得不抛弃依赖于con ...
- LeetCode85 Maximal Rectangle java题解
public static int maximalRectangle(char[][] matrix) { int rowNum=matrix.length; if(rowNum==0) return ...
- Asp.Net初学小结 判断数组中是否有重复的数据
Asp.Net初学小结 第一章 1.搭建Asp.net开发环境 1).net FrameWork(VS) 2)IIS(xp:5.1,2003:6.0,vista:70,win7:7.5) ...