zoukankan      html  css  js  c++  java
  • 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的结点),就可以开始旋转了。


     

  • 相关阅读:
    flex 只显示年、月的日期选择控件(TimeChooser)
    SQL 实现统计业务
    SQL 时间函数详解
    我与计算机
    ISE中FPGA的实现流程
    总结Verilog中always语句的使用
    VGA 时序标准
    ChipScope软件使用
    FIFO的使用场景
    Verilog 初级入门概念
  • 原文地址:https://www.cnblogs.com/xiaomaohai/p/6157641.html
Copyright © 2011-2022 走看看