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

    删除链表的指定元素:

    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 res=new StringBuilder();
        	ListNode cur=this;
        	while(cur!=null){
        		res.append(cur.val+"->");
        		cur=cur.next;
        	}
        	res.append("NULL");
        	return res.toString();
        }
    }
    

      第一种方法:

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

      使用头节点:

    public class Solution2 {
       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 head;
       }
       
       public static void main(String[] args){
       	int[] nums={1,2,3,4,5,6};
       	ListNode head=new ListNode(nums);
       	System.out.println(head);
       	ListNode res=(new Solution2()).removeElements(head, 6);
       	System.out.println(res);
       }
    }
    

      实现求数组递归的算法:

    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));
        }
    }
    

      用递归实现删除链表中的元素:

    public class Solution3 {
    	public ListNode removeElements(ListNode head,int val){
    		   if(head==null)
    			   return null;
    		  head.next = removeElements(head.next, val);
    		  return head.val==val? head.next:head;
    	   }
    	   
    	   public static void main(String[] args){
    	   	int[] nums={1,2,3,4,5,6};
    	   	ListNode head=new ListNode(nums);
    	   	System.out.println(head);
    	   	ListNode res=(new Solution3 ()).removeElements(head, 6);
    	   	System.out.println(res);
    	   }
    } 
    打印执行过程:
    public class Solution3 {
    public ListNode removeElements(ListNode head,int val,int depth){
    String depthString=generateDepthString(depth);
    System.out.println(depthString);
    System.out.println("Call:remove "+val+"in "+head);
    
    if(head==null){
    System.out.print(depthString);
    System.out.println("Call:remove "+val+"in "+head);
    return null;
    }
    
    ListNode res=removeElements(head.next, val,depth+1);
    System.out.print(depthString);
    System.out.println("After remove "+val+":"+res);
    ListNode ret;
    if(head.val==val)
    ret=res;
    else{
    head.next=res;
    ret=head;
    }
    System.out.print(depthString);
    System.out.println("Return:"+ret);
    return ret;
    }
    
    private String generateDepthString(int depth){
    StringBuilder res=new StringBuilder();
    for(int i=0;i<depth;i++)
    res.append("---");
    return res.toString();
    }
    
    public static void main(String[] args){
    int[] nums={1,2,3,4,5,6};
    ListNode head=new ListNode(nums);
    System.out.println(head);
    ListNode res=(new Solution3 ()).removeElements(head, 6,0);
    System.out.println(res);
    }
    }
    

      

  • 相关阅读:
    我的腾讯云服务器被暴力破解了
    asp.net 动态运用webservice并设置超时时间
    Elasticsearch7.4 spring boot 使用 RestHighLevelClient实现searchAfter分页
    华为OD机试题
    获取某日期后一周、一月、一年的日期 php
    PHP 读取文件夹(比如某共享文件夹)中的图片并显示
    php 获取某文件夹(比如共享文件夹)下图片并下载并压缩成zip
    数据库集群简单概念
    java数据流
    SpringBoot使用切面+注解实现对所有请求的日志记录到数据库中
  • 原文地址:https://www.cnblogs.com/sunliyuan/p/10590414.html
Copyright © 2011-2022 走看看