单链表反转 LeetCode 206

简介: 单链表反转 LeetCode 206

单链表反转 2种方法

  1. 空间换时间
  2. 时间换空间
package com.stan.work;
public class Step1 {
    /**
     * 单链表反转     206
     * 链表中环的检测  141
     * 两个有序的链表合并
     * 删除链表倒数第 n 个结点
     * 求链表的中间结点
     */
    /**
     * 自定义链表
     */
    public static class MyLinkNode {
        int val;
        MyLinkNode next;
        MyLinkNode() {
        }
        MyLinkNode(int val) {
            this.val = val;
        }
        MyLinkNode(int val, MyLinkNode next) {
            this.val = val;
            this.next = next;
        }
    }
    public static void main(String[] args) {
        MyLinkNode head = new MyLinkNode(1);
        MyLinkNode node1 = new MyLinkNode(2);
        MyLinkNode node2 = new MyLinkNode(3);
        MyLinkNode node3 = new MyLinkNode(4);
        head.next = node1;
        node1.next = node2;
        node2.next = node3;
        MyLinkNode node = reverseList(head);
        while (node != null) {
            System.out.print(node.val + " ");
            node = node.next;
        }
        System.out.println();
    }
    /**
     * 迭代翻转
     *
     * @param head
     * @return
     */
    public static MyLinkNode reverseList(MyLinkNode head) {
        MyLinkNode curr = head;
        MyLinkNode prev = null;
        while (curr != null) {
            // 先换指针位置 再换next值
            MyLinkNode next = curr.next;
            curr.next = prev;
            prev = curr;
            curr = next;
        }
        return prev;
    }
    /**
     * 递归翻转
     *
     * @param head
     * @return
     */
    public static MyLinkNode reverseList1(MyLinkNode head) {
        //递归出口
        if (head == null || head.next == null) {
            return head;
        }
        //先递后归
        MyLinkNode p = reverseList1(head.next);
        head.next.next = head;
        head.next = null;
        return p;
    }
    public static void searchNode(MyLinkNode head) {
        if (head == null) {
            return;
        }
        while (head != null && head.next != null) {
            System.out.print(head.val);
        }
    }
}


目录
相关文章
|
10月前
|
消息中间件 Kubernetes NoSQL
LeetCode 3、28、1351
LeetCode 3、28、1351
LeetCode 389. 找不同
给定两个字符串 s 和 t,它们只包含小写字母。
93 0
|
机器学习/深度学习
leetcode第50题
求幂次方,用最简单的想法,就是写一个 for 循环累乘。 至于求负幂次方,比如 2^{-10}2−10,可以先求出 2^{10}210,然后取倒数,1/2^{10}1/210 ,就可以了 double mul = 1; if (n > 0) { for (int i = 0; i < n; i++) { mul *= x; } } else { n = -n; for (int i = 0; i < n; i++) { mul *= x; } mul = 1 / mul; }
118 0
leetcode第50题
leetcode第39题
对回溯法又有了更深的了解,一般的架构就是一个大的 for 循环,然后先 add,接着利用递归进行向前遍历,然后再 remove ,继续循环。而解法二的动态规划就是一定要找到递进的规则,开始的时候就想偏了,导致迟迟想不出来。
leetcode第39题
|
算法
leetcode第42题
也就是红色区域中的水, 数组是 height = [ 0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1 ] 。 原则是高度小于 2,temp ++,高度大于等于 2,ans = ans + temp,temp = 0。 temp 初始化为 0 ,ans 此时等于 2。 height [ 0 ] 等于 0 < 2,不更新。 height [ 1 ] 等于 1 < 2,不更新。 height [ 2 ] 等于 0 < 2, 不更新。 height [ 3 ] 等于 2 >= 2, 开始更新 height [ 4 ] 等于 1 < 2,temp = temp + 1 = 1。 h
121 0
leetcode第42题
leetcode第48题
将一个矩阵顺时针旋转 90 度,并且不使用额外的空间。大概属于找规律的题,没有什么一般的思路,观察就可以了。 解法一 可以先转置,然后把每列对称交换交换一下
103 0
leetcode第48题
|
算法
leetcode第30题
如上图,利用循环变量 i ,依次后移,判断每个子串是否符合即可。 怎么判断子串是否符合?这也是这个题的难点了,由于子串包含的单词顺序并不需要固定,如果是两个单词 A,B,我们只需要判断子串是否是 AB 或者 BA 即可。如果是三个单词 A,B,C 也还好,只需要判断子串是否是 ABC,或者 ACB,BAC,BCA,CAB,CBA 就可以了,但如果更多单词呢?那就崩溃了。 链接)的作者提出了,用两个 HashMap 来解决。首先,我们把所有的单词存到 HashMap 里,key 直接存单词,value 存单词出现的个数(因为给出的单词可能会有重复的,所以可能是 1 或 2 或者其他)。然后扫描子
144 0
leetcode第30题
|
算法
leetcode第17题
假如是 "23" ,那么 第 1 次 for 循环结束后变为 a, b, c; 第 2 次 for 循环的第 1 次 while 循环 a 出队,分别加上 d e f 然后入队,就变成 b c ad ae af 第 2 次 for 循环的第 2 次 while 循环 b 出队,分别加上 d e f 然后入队,就变成 c ad ae af bd be bf 第 2 次 for 循环的第 3 次 while 循环 c 出队,分别加上 d e f 然后入队,就变成 ad ae af bd be bf cd ce cf 这样的话队列的元素长度再也没有等于 1 的了就出了 while 循环。
113 0
leetcode第17题
leetcode第23题
时间复杂度:假设 N 是所有的数字个数,存到数组是 O(N),排序如果是用快速排序就是 O(Nlog_N)O(NlogN) ,存到链表是 O(N),所以取个最大的,就是 O(Nlog_N)O(NlogN)。 空间复杂度:新建了一个链表,O(N)。
leetcode第23题
|
机器学习/深度学习
leetcode第5~6题
我们可以看到,图形其实是有周期的,0,1,2 ... 7 总过 8 个,然后就又开始重复相同的路径。周期的计算就是 cycleLen = 2 × numRows - 2 = 2 × 5 - 2 = 8 个。 我们发现第 0 行和最后一行一个周期内有一个字符,所以第一个字符下标是 0 ,第二个字符下标是 0 + cycleLen = 8,第三个字符下标是 8 + cycleLen = 16 。 其他行都是两个字符。 第 1 个字符和第 0 行的规律是一样的。 第 2 个字符其实就是下一个周期的第 0 行的下标减去当前行。什么意思呢? 我们求一下第 1 行第 1 个周期内的第 2 个字符
127 0
leetcode第5~6题