• [LeetCode]Reverse Linked List II


    很久没有打理cnblog的站点了,用octopress在github上搭了一个新主页,学术一些的笔记po用markdown在github主页更新。

    之前偶尔翻翻careercup,也会用白纸写些代码,但是很难坚持上机验证,链表/树的测试用例有些麻烦。暑假的时候刷了一些USACO的题目,OJ题难度略高,不是很适合准备面试。

    以上内容,一言以蔽之,曰:懒。

    正找工作的师兄推荐了LeetCode这个面试题OJ平台,题目难度和careercup相当,是个不错的练习平台。在暑假实习面试被狂虐以后,是时候知耻而后勇了。计划每天做两道题,3个月左右完成。立贴为证。

    今天的题目是部分链表逆序,将给定链表第m个节点到第n个节点的位置逆序,返回逆序后的链表。这是M记的暑期实习生面试的一道题目之一。链表似乎是M记面试最爱,没有什么高深的算法。

    解题思路:指针pp指向第m-1个节点,用p, q记录第m个节点和第n个节点,先将p,q都指向头节点,q比p先走n-m步,然后p,q一起走m步,即指向制定位置。将这部分链表逆序,将pp指向q,p指向第n+1个节点。注意m=1的情况。

    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->NULLm = 2 and n = 4,

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

    Note:
    Given mn satisfy the following condition:
    1 ≤ m ≤ n ≤ length of list.

     1 /**
     2  * Definition for singly-linked list.
     3  * struct ListNode {
     4  *     int val;
     5  *     ListNode *next;
     6  *     ListNode(int x) : val(x), next(NULL) {}
     7  * };
     8  */
     9 class Solution {
    10 public:
    11     ListNode *reverseBetween(ListNode *head, int m, int n) {
    12         // Note: The Solution object is instantiated only once and is reused by each test case.
    13         if(head==NULL)
    14             return head;
    15         
    16         ListNode *p = head, *q = head, *pp = NULL;
    17         for(int i = 1; i<n-m+1; ++i)
    18             q = q->next; // point to the end of reversed list
    19         for(int i=1; i<m; ++i)
    20         {
    21             pp = p;
    22             p = p->next;
    23             q = q->next;
    24         }
    25         // reverse p to q
    26         ListNode *a = p->next;
    27         while(p!=q)
    28         {
    29             ListNode *b = a->next;
    30             a->next = p;
    31             p = a; a = b;
    32         }
    33         if(pp)
    34         {
    35             pp->next->next = a;
    36             pp->next = q;
    37         }
    38         else
    39         {
    40             head->next = a;
    41             head = q;
    42         }
    43         
    44         return head;
    45     }
    46 };

  • 相关阅读:
    2019杭电多校第二场hdu6601 Keen On Everything But Triangle(主席树)
    洛谷P3812 【模板】线性基
    2019牛客多校第二场D-Kth Minimum Clique(优先队列+bitset)
    2019牛客多校第二场H-Second Large Rectangle(单调栈)
    2019杭电多校第一场hdu6581 Vacation(贪心)
    2019牛客多校第二场F-Partition problem(搜索+剪枝)
    2019牛客多校第一场 E-ABBA(dp)
    实验9:Problem H: 薪酬计算
    实验9:Problem G: 克隆人来了!
    实验9:Problem F: 我们来做个Student类吧!
  • 原文地址:https://www.cnblogs.com/practice/p/3382409.html
Copyright © 2020-2023  润新知