reverse-linked-list-ii

题目

reverse-linked-list-ii_第1张图片
就是从第二个位置到第四个位置的链表逆序,然后其他的不变

思路

对于这个链表在中间的情况来说,找到第m-1个和n+1个节点作为preStart 和nextEnd节点,然后对于中间链表逆序,preStart->end—–>start–>nextEnd
对于头节点的情况时,就需要把head=end 后面不变
总结思路:如果m为1,flag=true;表示逆序链表后需要head = end
preStart=head,然后找到第m-1,m,n,n+1个节点
判断m是否为1,把end付给head或者preStart.next start.next = nextEnd

代码

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public ListNode reverseBetween(ListNode head, int m, int n) {
        if(m==n) return head ;
        ListNode start=head,end = head,preStart=head,nextEnd=head;
        for(int i=0;i<m-1;i++){
            preStart = start;
            start = start.next;
        }
        for(int i=0;i<n-1;i++){
            end = end.next;
            nextEnd = end.next;
        }
        reverseList(start,end);
        if(m==1){
            head = end;
        }else{
            preStart.next = end;
        }
        start.next = nextEnd;
        return head;
    }
    public void reverseList(ListNode start,ListNode end){
        if(start==end) return ;
        ListNode stop = end.next;
        ListNode cur = start.next;
        while(cur!=stop){
            ListNode next = cur.next;
            cur.next = start;
            start = cur;
            cur = next;
        }
    }
}

你可能感兴趣的:(链表)