【leetcode-92】 反转链表 II

(没过,以为简单,结构链表指针搞得很复杂出错。是有捷径的,很典型题目要记住)

反转链表 II(medium)

反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。

说明:
1 ≤ m ≤ n ≤ 链表长度。

示例:

输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL

链接:https://www.nowcoder.com/questionTerminal/b58434e200a648c589ca2063f1faf58c
来源:牛客网

1.头插法
对于reverse部分有点迷糊。网上看到的解释,也许更能帮助理解.https://yq.aliyun.com/articles/3867
不妨拿出四本书,摞成一摞(自上而下为 A B C D),要让这四本书的位置完全颠倒过来(即自上而下为 D C B A):

盯住书A,每次操作把A下面的那本书放到最上面

初始位置:自上而下为 A B C B

第一次操作后:自上而下为 B A C D

第二次操作后:自上而下为 C B A D

第三次操作后:自上而下为 D C B A
public class Solution {
    public ListNode reverseBetween(ListNode head, int m, int n) {
        ListNode dummy = new ListNode(0);
        dummy.next = head;
        ListNode preStart = dummy;
        ListNode start = head;
        for (int i = 1; i < m; i ++ ) {
            preStart = start;
            start = start.next;
        }
        // reverse
        for (int i = 0; i < n - m; i ++ ) {
            ListNode temp = start.next;
            start.next = temp.next;
            temp.next = preStart.next;
            preStart.next = temp;
        }
        return dummy.next;
    }
}

2.三个指针向后遍历(我这样做但是死链了)

class Solution {
public ListNode reverseBetween(ListNode head, int m, int n) {

    if(head == null || m < 1 || m >= n  ){
        return head;
    }

    int i = 1;
    ListNode dummy = new ListNode(0);
    dummy.next = head;
    ListNode h1 = dummy;
    while (i < m){
        i++;
        h1 = h1.next;
    }

    ListNode p1 = h1.next;
    ListNode p2 = p1.next;
    ListNode p3 = p2.next;

    while (i < n) {
        i++;
        p2.next = p1;
        p1 = p2;
        p2 = p3;
        if (p3 != null) {
            p3 = p3.next;
        }
    }

    h1.next.next = p2;
    h1.next = p1;

    return dummy.next;
}
}

猜你喜欢

转载自www.cnblogs.com/twoheads/p/10605882.html