zoukankan      html  css  js  c++  java
  • 【leetcode刷题笔记】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->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.


    题解:

    如上图所示,几个重要的变量:

    prev记录m位置前一个位置上的ListNode,当完成2~5这一段的反转后,prev的next指针要设置成反转后的序列的第一个指针;

    head记录要反转的子列表的第一个ListNode;

    kepeler记录要反转的子列表的最后一个ListNode;

    有一种特殊的情况如下图所示:

    当要反转的序列的第一个ListNode就是链表的头结点的时候,prev指针为空。这时候反转后的链表头节点变成上述kepeler所指向的节点,所以要在最后单独处理。

    代码中21~25行的循环找到prev和head的位置,27~31行的循环找到kepeler的位置,33~39行的for循环将链表制定范围的链表反转。41行进行判断:反转后序列的头节点是否变成要反转的列表的最后一个节点——kepeler,如果是,返回kepeler,否则返回之前保存的原链表头结点。

     1 /**
     2  * Definition for singly-linked list.
     3  * public class ListNode {
     4  *     int val;
     5  *     ListNode next;
     6  *     ListNode(int x) {
     7  *         val = x;
     8  *         next = null;
     9  *     }
    10  * }
    11  */
    12 public class Solution {
    13     public ListNode reverseBetween(ListNode head, int m, int n) {
    14         int HeadNodes = 0;
    15         ListNode answer = head;
    16         ListNode prev = null;
    17         
    18         if(head == null || m >= n)
    19             return answer;
    20         
    21         while(HeadNodes+1 < m){
    22             prev = head;
    23             head = head.next;
    24             HeadNodes++;
    25         }
    26             
    27         ListNode kepeler = head;
    28         while(HeadNodes+1 < n){
    29             kepeler = kepeler.next;
    30             HeadNodes++;
    31         }
    32         
    33         for(int i = 0;i < n-m;i++){
    34             ListNode temp = head.next;
    35             head.next = kepeler.next;
    36             kepeler.next = head;
    37             
    38             head = temp;
    39         }
    40         
    41         if(prev == null)
    42             return kepeler;
    43         else{
    44             prev.next = kepeler;
    45             return answer;
    46         }
    47     }
    48 }
  • 相关阅读:
    有点忙啊
    什么是协程
    HDU 1110 Equipment Box (判断一个大矩形里面能不能放小矩形)
    HDU 1155 Bungee Jumping(物理题,动能公式,弹性势能公式,重力势能公式)
    HDU 1210 Eddy's 洗牌问题(找规律,数学)
    HDU1214 圆桌会议(找规律,数学)
    HDU1215 七夕节(模拟 数学)
    HDU 1216 Assistance Required(暴力打表)
    HDU 1220 Cube(数学,找规律)
    HDU 1221 Rectangle and Circle(判断圆和矩形是不是相交)
  • 原文地址:https://www.cnblogs.com/sunshineatnoon/p/3851482.html
Copyright © 2011-2022 走看看