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);
}
}
Java链表和递归的更多相关文章
- java 链表数据结构
首先,单链表相对于队列的优势在于存储地址不是连续的,这样的意义在于,操作其中的某一个位置的元素时不需要对之前的其他元素都进行内存操作,大大的为我们的计算机减压了.下面直接进入正题: 先要定义一个结点类 ...
- 学习记录 java 链表知识
01.import java.util.HashMap; 02.import java.util.Scanner; 03.import java.util.Stack; 04. 05./** 06. ...
- Java链表基本操作和Java.util.ArrayList
Java链表基本操作和Java.util.ArrayList 今天做了一道<剑指offer>上的一道编程题“从尾到头打印链表”,具体要求如下:输入一个链表,按链表值从尾到头的顺序返回一个A ...
- JAVA 链表操作:循环链表
主要分析示例: 一.循环链表简述 二.单链表循环链表 三.双链表循环链表 一.循环链表简述 循环链表即链表形成了一个循环的结构,尾节点不再指向NULL,而是指向头节点HEAD,此时判定链表的结束是尾节 ...
- Java中的递归运算
Java中的递归运算是一种在自己的方法内部调用自己的方法 递归的设计思想是:把一个复杂的问题,分解为若干个等同的子问题,重复执行,直到之问题能够简单到直接求解,这样复杂的问题就得以解决. 递归运算有两 ...
- Atitit 表达式原理 语法分析 原理与实践 解析java的dsl 递归下降是现阶段主流的语法分析方法
Atitit 表达式原理 语法分析 原理与实践 解析java的dsl 递归下降是现阶段主流的语法分析方法 于是我们可以把上面的语法改写成如下形式:1 合并前缀1 语法分析有自上而下和自下而上两种分析 ...
- [Java] [查找文件] [递归]]
// 工具方法 private static FilenameFilter getFilter(final String mode) { return new FilenameFilter() { P ...
- JAVA链表中迭代器的实现
注:本文代码出自<java数据结构和算法>一书. PS:本文中类的名字定义存在问题,Link9应改为Link.LinkList9应该为LinkList.由于在同包下存在该名称,所以在后面接 ...
- 【笔试题】Java 中如何递归显示一个目录下面的所有目录和文件?
笔试题 Java 中如何递归显示一个目录下面的所有目录和文件? import java.io.File; public class Test { private static void showDir ...
随机推荐
- 必须要学会webpack打包,并到特别精通的程度
必须要学会webpack打包,并到特别精通的程度
- mysql死锁-查询锁表进程-分析锁表原因【转】
查询锁表进程: 1.查询是否锁表 show OPEN TABLES where In_use > 0; 2.查询进程 show processlist 查询到相对应的进程===然 ...
- python的wrapt模块实现装饰器
wrapt是一个功能非常完善的包,用于实现各种你想到或者你没想到的装饰器.使用wrapt实现的装饰器你不需要担心之前inspect中遇到的所有问题,因为它都帮你处理了,甚至inspect.getsou ...
- u3d发送邮件
http://gad.qq.com/article/detail/22810 https://www.douban.com/note/655356118/ http://gad.qq.com/arti ...
- 一道并查集的(坑)题:关闭农场closing the farm
题目描述 in English: Farmer John and his cows are planning to leave town for a long vacation, and so FJ ...
- Sq lServer触发器的使用
创建表: CREATE TABLE [dbo].[GeneralRule]( [ID] [int] NOT NULL, ) NULL, [DeleteFlag] [int] NOT NULL ) CR ...
- java泛型类型变量能调用的方法
public class Person { } public class Student extends Person{ private String name; public Student(Str ...
- 【原创】大数据基础之Logstash(1)简介、安装、使用
Logstash 6.6.2 官方:https://www.elastic.co/products/logstash 一 简介 Centralize, Transform & Stash Yo ...
- js用replaceAll全部替换的方法
1 前言 js中字符串整体替换,只有自带的replace,并没有replaceAll,如果我们需要把字符串中的字符统一替换,可以用正则表达式,由于经常使用就在String直接加个原生方法,方便调用. ...
- [PHP]php缓冲 output_buffering的使用详解
bufferbuffer是一个内存地址空间,Linux系统默认大小一般为4096(4kb),即一个内存页.主要用于存储速度不同步的设备或者优先级不同的设备之间传办理数据的区域.通过buffer,可以使 ...