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

      

  • 相关阅读:
    Win10设置文件夹权限报错-(提示:无法枚举容器中的对象 访问被拒绝)
    判断上传文件是否是图片文件
    PB调用C#编写的Dll类库
    C#txt文件创建并写入信息
    三十分钟学完Vue
    html增加锚点定位
    Asp.Net WebApi 调试利器“单元测试”
    ios端 返回上一级后 卡在正在加载中处理方式
    [转]如何为图片添加热点链接?(map + area)
    JS获取当前时间并格式化"yyyy-MM-dd HH:mm:ss"
  • 原文地址:https://www.cnblogs.com/sunliyuan/p/10590414.html
Copyright © 2011-2022 走看看