个人记录-LeetCode 92. Reverse Linked List II

来源:互联网 发布:网址域名能换吗 编辑:程序博客网 时间:2024/06/05 03:49

问题:

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 ≤ m ≤ n ≤ length of list.

代码示例:

问题要求,逆向重排m~n之间的节点。

主要思路:
1、改变m~n之间next的指向,
即将a->b->c,变为a<-b<-c;

2、让m-1指向节点n,m指向n+1

代码如下:

/** * Definition for singly-linked list. * public class ListNode { *     int val; *     ListNode next; *     ListNode(int x) { val = x; } * } */public class Solution {    public ListNode reverseBetween(ListNode head, int m, int n) {        //m、n一致时,不需要改变        if (m == n) {            return head;        }        //记录m-1和m的位置        ListNode beforeM = null;        ListNode nodeM = null;        //记录n和n+1的位置        ListNode afterN = null;        ListNode nodeN = null;        //记录位置        int count = 0;        ListNode tmp = head;        //记录m~n中每个节点的前一个位置        ListNode before = null;        while (tmp != null) {            ++count;            //记录m-1的信息            if (count == m - 1) {                beforeM = tmp;                tmp = tmp.next;            } else if (count == m) {                //记录m的信息                nodeM = tmp;                //从m+1开始,需要使用before信息                before = tmp;                tmp = tmp.next;            } else if (count > m && count < n) {                //m~n之间,改变节点next的指向                ListNode next = tmp.next;                tmp.next = before;                before = tmp;                tmp = next;            } else if (count == n) {                //记录n和n+1的信息                nodeN = tmp;                afterN = nodeN.next;                nodeN.next = before;                //后面的不用管了                break;            } else {                //0~m-1之间时,正常移动即可                tmp = tmp.next;            }        }        //m-1指向n        if (beforeM != null) {            beforeM.next = nodeN;        } else {            //m为第一个节点时,逆向后n为头节点            head = nodeN;        }        //按题目的条件,m不会为null,next指向n+1        if (nodeM != null) {            nodeM.next = afterN;        }        return head;    }}
0 0
原创粉丝点击