删除链表的指定元素:
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); } }