zoukankan      html  css  js  c++  java
  • 49-Reverse Linked List II

    1. Reverse Linked List II My Submissions QuestionEditorial Solution
      Total Accepted: 70579 Total Submissions: 252986 Difficulty: Medium
      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->NULL, m = 2 and n = 4,

    return 1->4->3->2->5->NULL.
    思路:
    时间复杂度:O(n),空间复杂度O(1)
    找到指定段元素,对该段元素逆转,同时保留指定段的两端的邻居

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode(int x) : val(x), next(NULL) {}
     * };
     */
    class Solution {
    public:
        ListNode* reverseBetween(ListNode* head, int m, int n) {
                assert(n>=m);
                if(m==n)return head;
                int i=1,j=1;
                ListNode *p=head,*q=head,*prep=NULL;//保留指定段首元素的前一元素
                while(p!=NULL&&i++<m){
                    if(i==m)prep=p;
                    p=p->next;
                }
                while(q!=NULL&&j++<n)q=q->next;/找到各自的最终位置,越界为空
                if(p==NULL)return head;       //起始位置越界,直接返回head
                ListNode * tmp = p->next,*prenode = p,*qnext=q->next;
                while(tmp!=qnext)         //还未到达指定段的下一元素,则当前元素指向前一元素
                {  
                    ListNode *nextnode = tmp->next;
                    tmp->next = prenode;
                    prenode = tmp;
                    tmp = nextnode;
                 }
                 p->next = qnext;
                 if(prep!=NULL)prep->next = prenode;
                 else head = prenode;
                 return head;
            }
    };
  • 相关阅读:
    varnish反向代理
    Asp.Net MVC 3.0
    反向代理(Reverse Proxy)
    Go语言开发Windows应用
    Windows下安装NodeJS和CoffeeScript方法
    数据库设计....
    发布一个开源的c++网络事件库
    非小型电子商务系统设计经验分享 Coding changes the world
    SqlServer查询计划
    cocos2dx总结(一)HelloWord
  • 原文地址:https://www.cnblogs.com/freeopen/p/5482917.html
Copyright © 2011-2022 走看看