Java链表和递归

99封情书 提交于 2021-02-20 19:54:56

删除链表的指定元素:

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

  

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!