删除链表的指定元素:
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);
}
}
来源:oschina
链接:https://my.oschina.net/u/4387790/blog/3600222