• 翻转链表reverse linked list:全部,m~n


    全部

    [抄题]:

    Reverse a singly linked list.

    [思维问题]:

    以为要用dummy node

    [一句话思路]:

    直接全部转过来就行了,用dummy node反而多余

    [输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):

    [画图]:

    [一刷]:

    1. return curt错了,应该是pre

    [二刷]:

    1.  箭头左边就在等号左边,箭头右边就在等号右边
    2. 反正就是个模板

    [总结]:

    完全转过来之后,最早的prev应该是null

    [复杂度]:Time complexity: O(1) Space complexity: O(1)

    [英文数据结构,为什么不用别的数据结构]:

    [其他解法]:

    [Follow Up]:

    [题目变变变]:

    /**
     * Definition for singly-linked list.
     * public class ListNode {
     *     int val;
     *     ListNode next;
     *     ListNode(int x) { val = x; }
     * }
     */
    class Solution {
        public ListNode reverseList(ListNode head) {
            ListNode prev = null;
            ListNode curt = head;
            
            while(curt != null) {
                ListNode temp = curt.next;
                curt.next = prev;
                prev = curt;
                curt = temp;
            }
            return prev;
        }
    }
    View Code

    m~n

    [抄题]:

    [思维问题]:

    [一句话思路]:

    [输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):

    [画图]:

    千万别画错了!

    [一刷]:

    1. 第一层corner case是m,n的关系head本身就为空
    2. 用已经有的head表示m-1,能少定义一个变量。不要一下全定义了,要用的时候再定义。
    3. 先定义nNode 就是 mNode,然后对nNode操作就够了
    4. 翻转m-n用for循环就行了
    5. 一定要判断是否为空再.next
    6. ListNode premNode = head;声明和指定可以统一
    7. dummy是第一个节点,应该把head指向它,从它开始找
    8. 理解四部翻转法每一步的含义:存2next,当前反指,往后移 这道题里面只有m,postn需要移动
    9. if (head == null || m >= n)时,无法删除,还是要返回head
    5->null
    1
    1---------5

    [总结]:

    链表的头尾衔接关系别画错了,不方便debug

    [复杂度]:Time complexity: O(1) Space complexity: O(1)

    [英文数据结构,为什么不用别的数据结构]:

    linked list节约空间复杂度

    [其他解法]:

    [Follow Up]:

    [题目变变变]:

    /**
     * Definition for singly-linked list.
     * public class ListNode {
     *     int val;
     *     ListNode next;
     *     ListNode(int x) { val = x; }
     * }
     */
    class Solution {
        public ListNode reverseBetween(ListNode head, int m, int n) {
            if (head == null || m >= n) {
                return head;
            }
            
            ListNode dummy = new ListNode(0);
            dummy.next = head;
            //search for m-1 th
            head = dummy;
            for(int i = 1; i < m; i++) {
                if (head == null) {
                    return null;
                }
                head = head.next;
            }
            //reverse
            ListNode premNode = head;
            ListNode mNode = premNode.next;
            ListNode nNode = mNode;
            ListNode postnNode = nNode.next;
            for (int i = m; i < n; i++) {
                ListNode temp = postnNode.next;//2cun
                postnNode.next = nNode;//hui
                nNode = postnNode;//xia yi
                postnNode = temp;
            }
            
            //join up
            mNode.next = postnNode;
            premNode.next = nNode;
            
            return dummy.next;
        }
    }
    View Code
  • 相关阅读:
    算法第4章实践报告
    避免商品超卖的4种方案
    PHP 之获取Windows下CPU、内存的使用率
    XunSearch(讯搜)的使用教程步骤
    curl传递二维数组,打印没有数据,只显示Array
    使用Postfix和Dovecot收发电子邮件
    Mybatis中使用association进行关联的几种方式
    两个服务器之间文件互传
    php-fpm 高并发 参数调整
    高并发linux内核网络参数调优
  • 原文地址:https://www.cnblogs.com/immiao0319/p/8097537.html
Copyright © 2020-2023  润新知