zoukankan      html  css  js  c++  java
  • 链表和递归

    一、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/
    欢迎任何形式的转载,未经作者同意,请保留此段声明!

  • 相关阅读:
    windows环境搭建Vue2.0开发环境
    SQL Server Profiler监听指定SQL:勾选哪些事件
    Visual Studio 2019 双击解决方案,能打开项目文件,而不是打开.csproj的项目文件内容
    关于ElementUI的DatePicker时区问题
    CRM365切换语言的时候,产品表Product的名称字段name会改变
    两台服务器上SQL Server数据库数据互操作示例
    第一组项目总结
    Beta(6/6)
    Beta(4/6)
    Beta(2/6)
  • 原文地址:https://www.cnblogs.com/linlf03/p/14396750.html
Copyright © 2011-2022 走看看