单链表反转 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);
        }
    }
}


目录
相关文章
|
6月前
leetcode-1447:最简分数
leetcode-1447:最简分数
46 0
|
6月前
|
C++ Python
leetcode-283:移动零
leetcode-283:移动零
29 0
|
1月前
【LeetCode 02】暴力法总结
【LeetCode 02】暴力法总结
15 1
|
6月前
leetcode-827:最大人工岛
leetcode-827:最大人工岛
62 0
|
6月前
leetcode-475:供暖器
leetcode-475:供暖器
48 0
LeetCode 354. Russian Doll Envelopes
给定一些标记了宽度和高度的信封,宽度和高度以整数对形式 (w, h) 出现。当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样。 请计算最多能有多少个信封能组成一组“俄罗斯套娃”信封(即可以把一个信封放到另一个信封里面)。
81 0
LeetCode 354. Russian Doll Envelopes
leetcode 283 移动零
leetcode 283 移动零
57 0
|
C++ Python
LeetCode 771. Jewels and Stones
LeetCode 771. Jewels and Stones
80 0
|
存储 算法
leetcode第43题
个位乘个位,得出一个数,然后个位乘十位,全部乘完以后,就再用十位乘以各个位。然后百位乘以各个位,最后将每次得出的数相加。十位的结果要补 1 个 0 ,百位的结果要补两个 0 。相加的话我们可以直接用之前的大数相加。直接看代码吧。
leetcode第43题
|
算法
leetcode第40题
会发现出现了很多重复的结果,就是因为没有跳过重复的 1。在求 opt [ 1 ] 的时候就变成了 [ [ 1 ],[ 1 ] ] 这样子,由于后边求的时候都是直接在原来每一个列表里加数字,所有后边都是加了两次了。
leetcode第40题