反转链表题解
反转链表
http://www.nowcoder.com/questionTerminal/75e878df47f24fdc9dc3e400ec6058ca
题目
已经定义好了数据结构,是一个经典题。
两个思路:
1、拿额外存储空间放,遍历一次。放的时候构建链表间关系。
2、一共三个指针,从头到尾遍历的时候,直接构建。
建议2,练自己对链表的空间思维能力。
1就是循环建立关系,往里放,面试官给你10分钟你还做不出来,捐了吧。
如果能脑海中画出图来,那就这道题ok了,就是结果不对而调整细节的事情了。就不用捐了。
开始起手式。
数据结构准备:
ListNode left = null; ListNode cur = head; ListNode right = null;
劲儿已经起来了,开始挥拳。
算法:
1、确定解题规模,拿while走一遍链表,就O(n)
while(cur != null) {
2、想好怎么传递这个指针,边走边连,要连几下。
先肯定把右边的给上,没人影响它。
right = cur.next;
3、再就用一个费一个,cur.next被用了,该搞它了。
cur.next = left;
4、这时候已经是那么回事了,尾巴已经到位了。
那得想啥,从屁股往头走,推:
下一个cur,next都放到该放的位置。
left = cur; cur = right; }
5、跑个测试用例,通了。
好,打完收工。关键词松果,懂得都懂。
按照自己习惯总结一下(没习惯也得养成这个习惯):
1、对链表题,脑海中要有想象力;
2、要总结出最小运算单元,这是要往while一次循环里面写的;
3、记得非空检查,初始化和算法跑的时候都得看看。
4、自信一点。犯错了再改都行,但是得自信。
提个bug:
题目提交之后,可以任意拖动那个“恭喜通过本题”的框,另外没有关闭这个的按钮,或者不显眼。
好,收工。
呼~