• 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 }

     
  • 相关阅读:
    Java字符编码问题
    Andrew Ng机器学习公开课笔记 -- 支持向量机
    Andrew Ng机器学习公开课笔记 -- 朴素贝叶斯算法
    Andrew Ng机器学习公开课笔记 -- Generative Learning algorithms
    Andrew Ng机器学习公开课笔记 -- Generalized Linear Models
    技术书单整理
    Andrew Ng机器学习公开课笔记 -- Logistic Regression
    Andrew Ng机器学习公开课笔记 -- 线性回归和梯度下降
    统计学习方法笔记 -- 决策树
    POJ1037 A decorative fence 【动态规划】
  • 原文地址:https://www.cnblogs.com/qqky/p/6857150.html
Copyright © 2020-2023  润新知