zoukankan      html  css  js  c++  java
  • 【1】【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;
        }
    }

     我看了思路后:

        public ListNode reverseBetween(ListNode head, int m, int n) {
            ListNode dummy = new ListNode(0);
            dummy.next = head;
            ListNode mpre = dummy;
            for (int i=1;i<m;i++) {
                mpre = mpre.next;
            }
            ListNode p1 = mpre.next;
            ListNode p2 = p1.next;
            for (int i=0;i<n-m;i++) {
                p1.next = p2.next; //p1不动
                p2.next = mpre.next;
                mpre.next = p2;
                p2 = p1.next;
            }
            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;
    }
    }

     

    再看反转链表 I很简单

     反转链表 I

    反转一个单链表。

    示例:

    输入: 1->2->3->4->5->NULL
    输出: 5->4->3->2->1->NULL

    进阶:
    你可以迭代或递归地反转链表。你能否用两种方法解决这道题?

        public ListNode reverseList(ListNode head) {
            if (head == null){
                return null;
            }
            ListNode dummy = new ListNode(0);
            dummy.next = head;
            while(head.next != null) {
                ListNode p = head.next;
                head.next = p.next;
                p.next = dummy.next;
                dummy.next = p;
            }
            return dummy.next;
        }
  • 相关阅读:
    cpu核数和逻辑个数的区别_CPU逻辑核心数和物理核心数
    linux查看CPU数
    Java读取excel中日期格式结果为数字44326天
    Java实现读取excel中的数据及图片
    jmeter设置全局变量,获取登录token,实现两个线程组参数公用
    CPU使用率
    快照版本和发布版本区别
    jmeter与postman请求结果返回不一致
    接口认证方式:Bearer Token
    jmeter 中报java.lang.OutOfMemoryError: Java heap space
  • 原文地址:https://www.cnblogs.com/twoheads/p/10605882.html
Copyright © 2011-2022 走看看