zoukankan      html  css  js  c++  java
  • 翻转链表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
  • 相关阅读:
    zoj 2316 Matrix Multiplication 解题报告
    BestCoder7 1001 Little Pony and Permutation(hdu 4985) 解题报告
    codeforces 463C. Gargari and Bishops 解题报告
    codeforces 463B Caisa and Pylons 解题报告
    codeforces 463A Caisa and Sugar 解题报告
    CSS3新的字体尺寸单位rem
    CSS中文字体对照表
    引用外部CSS的link和import方式的分析与比较
    CSS样式表引用方式
    10个CSS简写/优化技巧
  • 原文地址:https://www.cnblogs.com/immiao0319/p/8097537.html
Copyright © 2011-2022 走看看