zoukankan      html  css  js  c++  java
  • 玩转数据结构:第5章 链表和递归

    链表和递归


    5-1 Leetcode中和链表相关的问题 

    Java类的递归,包含的成员变量有该类本身。

    ListNode

    //Definition for singly-linked list.
    public class ListNode {
    
        public int val;
        public ListNode next;
    
        public ListNode(int x) {
            val = x;
        }
    }
    View Code

    /// Leetcode 203. Remove Linked List Elements
    /// https://leetcode.com/problems/remove-linked-list-elements/description/

     Solution

    /// Leetcode 203. Remove Linked List Elements
    /// https://leetcode.com/problems/remove-linked-list-elements/description/
    
    class Solution {
    
        public ListNode removeElements(ListNode head, int val) {
    
            while(head != null && head.val == val){
                ListNode delNode = head;
                head = head.next;
                delNode.next = null;
            }
    
            if(head == null)
                return head;
    
            ListNode prev = head;
            while(prev.next != null){
                if(prev.next.val == val) {
                    ListNode delNode = prev.next;
                    prev.next = delNode.next;
                    delNode.next = null;
                }
                else
                    prev = prev.next;
            }
    
            return head;
        }
    }
    View Code

     Solution2

    /// Leetcode 203. Remove Linked List Elements
    /// https://leetcode.com/problems/remove-linked-list-elements/description/
    
    class Solution2 {
    
        public ListNode removeElements(ListNode head, int val) {
    
            while(head != null && head.val == val)
                head = head.next;
    
            if(head == null)
                return head;
    
            ListNode prev = head;
            while(prev.next != null){
                if(prev.next.val == val)
                    prev.next = prev.next.next;
                else
                    prev = prev.next;
            }
    
            return head;
        }
    }
    View Code

     Solution3

    /// Leetcode 203. Remove Linked List Elements
    /// https://leetcode.com/problems/remove-linked-list-elements/description/
    
    class Solution3 {
    
        public ListNode removeElements(ListNode head, int val) {
    
            ListNode dummyHead = new ListNode(-1);
            dummyHead.next = head;
    
            ListNode prev = dummyHead;
            while(prev.next != null){
                if(prev.next.val == val)
                    prev.next = prev.next.next;
                else
                    prev = prev.next;
            }
    
            return dummyHead.next;
        }
    }
    View Code

    5-2 测试自己的Leetcode链表代码 

    //Definition for singly-linked list.
    public class ListNode {
    
        public int val;
        public ListNode next;
    
        public ListNode(int x) {
            val = x;
        }
    
        // 链表节点的构造函数
        // 使用arr为参数,创建一个链表,当前的ListNode为链表头结点
        public ListNode(int[] arr){
    
            if(arr == null || arr.length == 0)
                throw new IllegalArgumentException("arr can not be empty");
    
            this.val = arr[0];
            ListNode cur = this;
            for(int i = 1 ; i < arr.length ; i ++){
                cur.next = new ListNode(arr[i]);
                cur = cur.next;
            }
        }
    
        // 以当前节点为头结点的链表信息字符串
        @Override
        public String toString(){
    
            StringBuilder s = new StringBuilder();
            ListNode cur = this;
            while(cur != null){
                s.append(cur.val + "->");
                cur = cur.next;
            }
            s.append("NULL");
            return s.toString();
        }
    }
    ListNode

    class Solution3

    class Solution3 {
    
        public ListNode removeElements(ListNode head, int val) {
    
            ListNode dummyHead = new ListNode(-1);
            dummyHead.next = head;
    
            ListNode prev = dummyHead;
            while(prev.next != null){
                if(prev.next.val == val)
                    prev.next = prev.next.next;
                else
                    prev = prev.next;
            }
    
            return dummyHead.next;
        }
    
        public static void main(String[] args) {
    
            int[] nums = {1, 2, 6, 3, 4, 5, 6};
            ListNode head = new ListNode(nums);
            System.out.println(head);
    
            ListNode res = (new Solution3()).removeElements(head, 6);
            System.out.println(res);
        }
    }
    View Code

    5-3 递归基础与递归的宏观语意 

     本质上,将原来的问题,转化为更小的同一问题。

     递归函数就是一个函数,完成一个功能。

    public class Sum {
    
        public static int sum(int[] arr){
            return sum(arr, 0);
        }
    
        // 计算arr[l...n)这个区间内所有数字的和
        private static int sum(int[] arr, int l){
            if(l == arr.length)
                return 0;
            return arr[l] + sum(arr, l + 1);
        }
    
        public static void main(String[] args) {
    
            int[] nums = {1, 2, 3, 4, 5, 6, 7, 8};
            System.out.println(sum(nums));
        }
    }
    View Code

     5-4 链表的天然递归结构性质

    class Solution4 {
    
        public ListNode removeElements(ListNode head, int val) {
    
            if(head == null)
                return head;
    
            ListNode res = removeElements(head.next, val);
            if(head.val == val)
                return res;
            else{
                head.next = res;
                return head;
            }
        }
    
        public static void main(String[] args) {
    
            int[] nums = {1, 2, 6, 3, 4, 5, 6};
            ListNode head = new ListNode(nums);
            System.out.println(head);
    
            ListNode res = (new Solution4()).removeElements(head, 6);
            System.out.println(res);
        }
    }
    Solution4

     5-5 递归运行的机制:递归的微观解读

     

    部分内容来自于学习编程期间收集于网络的免费分享资源和工作后购买的付费内容。
  • 相关阅读:
    Javascript笔记01:javascript入门介绍
    css笔记19:浮动的案例
    css笔记17:盒子模型加强版的案例
    css笔记16:盒子模型的入门案例
    css笔记15:盒子模型
    css笔记14:css文件之间可以相互引用
    HDU 1203 I NEED A OFFER!
    HDU 2955 Robberies
    HDU 2602 Bone Collector
    HDU 2546 饭卡
  • 原文地址:https://www.cnblogs.com/MarlonKang/p/12344067.html
Copyright © 2011-2022 走看看