zoukankan      html  css  js  c++  java
  • leetcode链表--9、reverse-linked-list-ii(翻转区间的链表)

    题目描述
     
    Reverse a linked list from position m to n. Do it in-place and in one-pass.
    For example:Given1->2->3->4->5->NULL, m = 2 and n = 4,return1->4->3->2->5->NULL.
    Note:
    Given mn satisfy the following condition:1 ≤ m ≤ n ≤ length of list.
     
    解题思路:
    1)找到要翻转区间的第一个结点并记录该结点的前一个结点pre
    2)找到要翻转区间的最后一个结点
    3)翻转区间的链表,并保证后续的链表正确连接在链上
    4)将翻转的第一个结点的前一结点与链表连接(分为两种情况,一种pre为空则返回翻转后链表,一种不为空,则连接,然后返回head)
     1 #include <iostream>
     2 #include <malloc.h>
     3 using namespace std;
     4 
     5 struct ListNode {
     6     int val;
     7     ListNode *next;
     8     ListNode(int x) : val(x), next(NULL) {}
     9 };
    10 /*在链表的末端插入新的节点,建立链表*/
    11 ListNode *CreateList(int n)
    12 {
    13     ListNode *head;
    14     ListNode *p,*pre;
    15     int i;
    16     head=(ListNode *)malloc(sizeof(ListNode));
    17     head->next=NULL;
    18     pre=head;
    19     for(i=1;i<=n;i++)
    20     {
    21         p=(ListNode *)malloc(sizeof(ListNode));
    22         cin>>p->val;
    23         pre->next=p;
    24 
    25         pre=p;
    26     }
    27     p->next=NULL;
    28 
    29     return head->next;//不带空的头结点
    30 }
    31 /*-------------------------输出链表-----------------------------------*/
    32 void PrintList(ListNode *h)
    33 {
    34     ListNode *p;
    35 
    36     p=h;//不带空的头结点
    37     while(p)
    38     {
    39         cout<<p->val<<" ";
    40         p=p->next;
    41         cout<<endl;
    42     }
    43 }
    44 class Solution {
    45 public:
    46     //例 1->2->3->4->5->6->NULL   m=2  n=5
    47     ListNode *reverseBetween(ListNode *head, int m, int n) {
    48         if(head == NULL)
    49             return NULL;
    50 
    51         ListNode *pNode = head;
    52         ListNode *pre =NULL;
    53 
    54         for(int i=1;i<m;i++)
    55         {
    56             pre = pNode;
    57             pNode = pNode->next;
    58         }
    59         ListNode *last = pNode;
    60         for(int i=m;i<n;i++)
    61         {
    62             last = last->next;
    63         }
    64         //翻转pNode last之间的结点
    65         for(int i=0;i<n-m;i++)
    66         {
    67             ListNode *temp = pNode->next;
    68             pNode->next = last->next;
    69             last->next = pNode;
    70 
    71             pNode = temp;
    72         }
    73         if(pre == NULL)
    74             return last;
    75         else
    76         {
    77             pre->next = last;
    78             return head;
    79         }
    80     }
    81 
    82 
    83 };
    84 int main()
    85 {
    86     int n1;
    87     ListNode *h;
    88     cout<<"输入链表1的结点数目"<<endl;
    89     cin>>n1;
    90     h = CreateList(n1);
    91     cout<<"链表1为:"<<endl;
    92     PrintList(h);
    93     Solution s;
    94     s.reverseBetween(h,2,5);
    95     cout<<"翻转后:"<<endl;
    96     PrintList(h);
    97 
    98 }

     
  • 相关阅读:
    关于slmgr命令
    .msi安装包安装方法(安装错误2503和2502)
    BIOS相关
    C和C#的区别
    关于del命令
    win8快捷键
    Windows 8 系统快捷键热键列表收集
    Android开发环境搭建
    关于Android sdkmanager目录结构的总结
    关于eclipse新建项目问题
  • 原文地址:https://www.cnblogs.com/qqky/p/6857150.html
Copyright © 2011-2022 走看看