删除链表的指定元素:

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

  

Java链表和递归的更多相关文章

  1. java 链表数据结构

    首先,单链表相对于队列的优势在于存储地址不是连续的,这样的意义在于,操作其中的某一个位置的元素时不需要对之前的其他元素都进行内存操作,大大的为我们的计算机减压了.下面直接进入正题: 先要定义一个结点类 ...

  2. 学习记录 java 链表知识

    01.import java.util.HashMap; 02.import java.util.Scanner; 03.import java.util.Stack; 04. 05./** 06. ...

  3. Java链表基本操作和Java.util.ArrayList

    Java链表基本操作和Java.util.ArrayList 今天做了一道<剑指offer>上的一道编程题“从尾到头打印链表”,具体要求如下:输入一个链表,按链表值从尾到头的顺序返回一个A ...

  4. JAVA 链表操作:循环链表

    主要分析示例: 一.循环链表简述 二.单链表循环链表 三.双链表循环链表 一.循环链表简述 循环链表即链表形成了一个循环的结构,尾节点不再指向NULL,而是指向头节点HEAD,此时判定链表的结束是尾节 ...

  5. Java中的递归运算

    Java中的递归运算是一种在自己的方法内部调用自己的方法 递归的设计思想是:把一个复杂的问题,分解为若干个等同的子问题,重复执行,直到之问题能够简单到直接求解,这样复杂的问题就得以解决. 递归运算有两 ...

  6. Atitit 表达式原理 语法分析 原理与实践 解析java的dsl  递归下降是现阶段主流的语法分析方法

    Atitit 表达式原理 语法分析 原理与实践 解析java的dsl  递归下降是现阶段主流的语法分析方法 于是我们可以把上面的语法改写成如下形式:1 合并前缀1 语法分析有自上而下和自下而上两种分析 ...

  7. [Java] [查找文件] [递归]]

    // 工具方法 private static FilenameFilter getFilter(final String mode) { return new FilenameFilter() { P ...

  8. JAVA链表中迭代器的实现

    注:本文代码出自<java数据结构和算法>一书. PS:本文中类的名字定义存在问题,Link9应改为Link.LinkList9应该为LinkList.由于在同包下存在该名称,所以在后面接 ...

  9. 【笔试题】Java 中如何递归显示一个目录下面的所有目录和文件?

    笔试题 Java 中如何递归显示一个目录下面的所有目录和文件? import java.io.File; public class Test { private static void showDir ...

随机推荐

  1. 论文笔记:Selective Search for Object Recognition

    与 Selective Search 初次见面是在著名的物体检测论文 「Rich feature hierarchies for accurate object detection and seman ...

  2. openGL之坐标变换

  3. linux 用户密码到期导致ftp业务失败

    外网反馈某业务失败,查看log发现FTP连接失败,定位发现提示密码不对,重新修改FTP密码后恢复正常. 但同时定位了下FTP密码被修改的原因,发现是密码过期了,因此查了下资料,查得修改过期时间的方法 ...

  4. AMBA总线协议AHB、APB、AXI对比分析【转】

    转自:https://blog.csdn.net/ivy_reny/article/details/56274412 一.AMBA概述    AMBA (Advanced Microcontrolle ...

  5. cocos开发插件笔记

    写插件菜单时要注意大小写 { "name": "hello-world", "version": "0.0.1", &q ...

  6. 出现警告“user1 不在 sudoers 文件中。此事将被报告。”

    linux中不是每个用户都有sudo权限. 在/etc/下有个文件sudoers 由此文件可知只有用户为sudo这个组的成员之后才能执行sudo命令 此时,我们查看用户user1的属性: 由此看出us ...

  7. shutil.copy()、os.walk()、os.rename()实例

    #!/usr/bin/python # -*- coding: UTF-8 -*- import os import shutil Path = "panel/" PNPath = ...

  8. SIFT+BOW 实现图像检索

    原文地址:https://blog.csdn.net/silence2015/article/details/77374910 本文概述 图像检索是图像研究领域中一个重要的话题,广泛应用于医学,电子商 ...

  9. (转!)Pyinstaller 打包发布经验总结

    原文地址 https://blog.csdn.net/weixin_42052836/article/details/82315118 具体的实现图待本人实现后贴上 原 Pyinstaller 打包发 ...

  10. (常用)loogging模块及(项目字典)

    loogging模块 '''import logging logging.debug('debug日志') # 10logging.info('info日志')   # 20logging.warni ...