zoukankan      html  css  js  c++  java
  • 【leetcode】92. 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->NULL, m = 2 and n = 4,

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

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

    Tips:给定一个链表,与两个整数m ,n;

    从m位置开始,到n位置结束,反转这段链表,返回翻转后的链表。

    思路:先让pre指针向前走m-1个位置,记住当前的结点 NodeBeforeM。

    在让pre指针想下走一个位置到达m处,记下当前结点为nodeM

    m+1位置的结点记为 cur

    从m~n 通过改动指针的方式来翻转这段链表,代码如下

    for(int i=m;i<n;i++){
                    ListNode next=cur.next;
                    cur.next=pre;
                    pre=cur;
                    cur=next;
                }

    结束循环之后,

    pre结点指向n位置的结点

    cur结点指向n+1位置的结点

    再将NodeBeforeM cur结点与翻转后的结点 前后连接起来 就可以了。

    整体代码如下:

    package medium;
    
    import dataStructure.ListNode;
    
    public class L92ReverseLinkedListII {
         public ListNode reverseBetween(ListNode head, int m, int n) {
             if(head==null ||m<=0||n<=0||m>n)
                 return null;
             if(m==n) return head;
                ListNode node = new ListNode(0);
                ListNode pre=node;
                pre.next=head;
                node=pre;
                for(int i=1;i<m;i++){
                    pre=pre.next;
                }
                ListNode nodeBeforeM=pre;
                System.out.println("nodeBaforeM:"+nodeBeforeM.val);
                pre=pre.next;
                ListNode nodeM=pre;
                System.out.println("nodeM:"+nodeM.val);
                ListNode cur=pre.next;
                System.out.println("cur"+cur.val);
                for(int i=m;i<n;i++){
                    ListNode next=cur.next;
                    cur.next=pre;
                    pre=cur;
                    cur=next;
                }
                System.out.println("!!!!!!!!!!!!");
                System.out.println("pre"+pre.val);
                System.out.println("cur"+cur.val);
                System.out.println("next"+cur.next.val);
                System.out.println("!!!!!!!!!!!!");
                nodeBeforeM.next=pre;
                nodeM.next=cur;
                return node.next;
            }
         public static void main(String[] args) {
            L92ReverseLinkedListII l92 = new L92ReverseLinkedListII();
            ListNode head1 = new ListNode(1);
            ListNode head2 = new ListNode(2);
            ListNode head3 = new ListNode(3);
            ListNode head4 = new ListNode(4);
            ListNode head5 = new ListNode(5);
            ListNode head6 = new ListNode(6);
            ListNode head7 = new ListNode(7);
            ListNode head8 = new ListNode(8);
            ListNode head9 = new ListNode(9);
            ListNode head10=null;
            head1.next = head2;
            head2.next = head3;
            head3.next = head4;
            head4.next = head5;
            head5.next = head6;
            head6.next = head7;
            head7.next = head8;
            head8.next = head9;
            head9.next = head10;
            int n=4 ,m=2;
            ListNode head = l92.reverseBetween(head1, m, n);
            while(head!=null){
                System.out.println(head.val);
                head=head.next;
            }
        }
    }

    输出结果如下:

    nodeBaforeM:1
    nodeM:2
    cur3
    !!!!!!!!!!!!
    pre4
    cur5
    next6
    !!!!!!!!!!!!
    m=2;~~~~~n=4;
    1 ->2 ->3 ->4 ->5 ->6 ->7 ->8 ->9 
    ~~~~~~~~~~~~~~~~~~~~~~~
    1 ->4 ->3 ->2 ->5 ->6 ->7 ->8 ->9 
  • 相关阅读:
    Python3入门基础--str常用方法
    大学jsp实验4include,forword
    大学jsp实验3include指令的使用
    初识MFC----运行时类信息机制
    状态栏
    工具栏
    菜单栏
    程序启动画面
    字符串的截取
    字符串相关类
  • 原文地址:https://www.cnblogs.com/yumiaomiao/p/8414394.html
Copyright © 2011-2022 走看看