Leetcode解题-链表(2.2.2)ReverseLinkedList

题目:2.2.2 Reverse Linked List II

Reverse a linked list from position m to n. Do it in-place and in one-pass.

For example:

Given 1->2->3->4->5->nullptr, m = 2 and n = 4,

return 1->4->3->2->5->nullptr.

Note: Given m, n satisfy the following condition: 1 <= m <= n <= length of list.

链表旋转是个经典问题,可以锻炼我们操作链表的能力,值得好好学习一下。

我的方法:对headtail特殊化处理

m<=i<=n时,通过记录前继结点prev,简单的调转next指针方向,并记录m结点pm。最后迭代到n+1时,再处理firstpm->next)和lastp)结点的指向问题。


 

更好的方法:一般化处理

将整个过程一般化处理的方法为:不断地将当前结点cur插入到head的后面。(见下面图示)第一次将3插入到1后面,第二次将4插入到1后面,即1=>2=>3=>4旋转为1=>3=>2=>4。如果能解决的话,那么继续1=>3=>2=>4=>5就能旋转为1=>4=>3=>2=>5,从而解决问题。总结:首先举最简单的例子解决,然后看解决办法能否继续推广到更复杂一些的例子,避免复杂的特殊化处理


代码实现

理解了整体设计,自己实现或读代码就很简单了。开始真正处理前要记住headm的前一个结点)和pm(索引为m的结点),就可以开始旋转了。


 

posted on 2015-03-28 11:17  毛小娃  阅读(92)  评论(0编辑  收藏  举报

导航