• 链表和递归


    一、Leetcode中与链表向操作

    203. 移除链表元素

    删除链表中等于给定值 val 的所有节点。

    示例:

    输入: 1->2->6->3->4->5->6, val = 6
    输出: 1->2->3->4->5

    https://leetcode-cn.com/problems/remove-linked-list-elements/

    解答:

    public class ListNode {
    
        int val;
        ListNode next;
        ListNode() {}
        ListNode(int val) { this.val = val; }
        ListNode(int val, ListNode next) { this.val = val; this.next = next; }
    }
    

      

    removeElements方法。方式1

     public ListNode removeElements(ListNode head, int val){
    
            //从head开始,删除所有val值相同的元素。
            while (head != null && head.val == val){
                ListNode delNode = head;
                head = head.next;
                delNode.next = null;
            }
            //如果前面已经删完,则返回null
            if(head == null){
                return  null;
            }
            ListNode pre = head;
            //从第2个节点开始遍历所有元素
            while (pre.next != null){
                if(pre.next.val == val){
                    ListNode delNode = pre.next;
                    pre.next = delNode.next;
                    delNode.next = null;
                }else {
                    pre = pre.next;
                }
            }
    
            return  head;
        }
    

      

    方式2:

    将方式1改成方式2

     /**
         * 方式2
         */
        public ListNode removeElements2(ListNode head, int val){
    
            //从head开始,删除所有val值相同的元素。
            while (head != null && head.val == val){
    
                head = head.next;
    
            }
            //如果前面已经删完,则返回null
            if(head == null){
                return  null;
            }
            ListNode pre = head;
            //从第2个节点开始遍历所有元素
            while (pre.next != null){
                if(pre.next.val == val){
                    pre.next = pre.next.next;
                }else {
                    pre = pre.next;
                }
            }
    
            return  head;
        }
    

      

    方式3 使用虚拟头节点

    这样都不用对头结点做特殊处理。

    /**
         * 方式3 使用虚拟头节点
         */
        public ListNode removeElements3(ListNode head, int val){
    
            //创建虚拟头节点
            ListNode dummyHead = new ListNode(-1);
            dummyHead.next = head;
    
            ListNode pre = dummyHead;
            //从第2个节点开始遍历所有元素
            while (pre.next != null){
                if(pre.next.val == val){
                    pre.next = pre.next.next;
                }else {
                    pre = pre.next;
                }
            }
    
            return  dummyHead.next;
        }
    

      

    方式4 使用递归

        /**
         * 方式4 使用递归
         */
        public ListNode removeElements4(ListNode head, int val){
    
          if(head == null){
              return  null;
          }
          //res 为除了head节点的右边节点。
          ListNode res = removeElements4(head.next, val);
          if(head.val == val){
              return  res;
          }else {
              head.next =res;
              return  head;
          }
        }
    

      

    作者:Work Hard Work Smart
    出处:http://www.cnblogs.com/linlf03/
    欢迎任何形式的转载,未经作者同意,请保留此段声明!

  • 相关阅读:
    Docker入门
    服务配置中心
    zuul网关
    git2
    git1
    git
    shiro授权、注解式开发
    shiro认证-SSM
    Shiro入门
    Springmvc之文件上传
  • 原文地址:https://www.cnblogs.com/linlf03/p/14396750.html
Copyright © 2020-2023  润新知