首页 > Java链表和递归

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");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;elseprev=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

  

转载于:https://www.cnblogs.com/sunliyuan/p/10590414.html

更多相关:

  • 题目:链表中倒数第k个节点 输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。 示例: 给定一个链表: 1->2->3->4->5, 和 k =...

  • 题目:从尾到头打印链表 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。 示例 1: 输入:head = [1,3,2] 输出:[2,3,1] 限制: 0 <= 链表长度 <= 10000 题目: /*** Definition for singly-linked list.* struct Lis...

  • 将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。  示例:输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4 解法一:双指针法 时间复杂度:O(a+b) 循环比较两个子问题的次数为 a+b a,b为两个子问题的长度空间复杂度:O(1) 双指针,常数级别复杂度...

  • 这是一道经典的面试题,下面是我的研究和举一反三,特整理如下: 分为三种情形: (1)删除有序链表的重复节点,重复节点一个都不留 (2)删除有序链表的重复节点,重复节点只留一个 (3)删除无序链表的重复节点,重复节点只留一个 下面是相关节点的定义: typedef struct ListNode {int val;struc...

  • 下面是后面链表相关题目中需要用到的链表结点的定义和相关操作函数,参见下面的list.h文件: 注意链表结点的定义采用cpp的定义方式,它会被cpp的文件调用。比如后面删除链表重复结点的文件del_repeated_list.cpp中的编译方式: g++ -g del_repeated_list.cpp -o del_repeate...

  • 题目:复杂链表的复制 请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。 示例 1: 输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]] 输出...

  • 给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。 你应当保留两个分区中每个节点的初始相对位置。 示例: 输入: head = 1->4->3->2->5->2, x = 3 输出: 1->2->2->4->3->5 使用双指针的方式,各自构造一个大元素的头节点和小元素...

  • 给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。 说明:不允许修改给定的链表。 示例 1: 输入:head = [3,2,0,-4], pos = 1...

  • 题目描述如下: 反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。 说明: 1 ≤ m ≤ n ≤ 链表长度。 示例: 输入: 1->2->3->4->5->NULL, m = 2, n = 4 输出: 1->4->3->2->5->NULL 很明显这个题目是206 反转链表的进阶版 需要记录第m-1个节点和第n+1个...

  • 描述如下: 反转一个单链表。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 方法一:原地反转 数据结构如下 struct ListNode {int val;ListNode *next;ListNode(int x) : val(x), next(NULL) {}...

  •         Apache POI是一个开源的利用Java读写Excel,WORD等微软OLE2组件文档的项目。        我的需求是对Excel的数据进行导入或将数据以Excel的形式导出。先上简单的测试代码:package com.xing.studyTest.poi;import java.io.FileInputSt...

  • 要取得[a,b)的随机整数,使用(rand() % (b-a))+ a; 要取得[a,b]的随机整数,使用(rand() % (b-a+1))+ a; 要取得(a,b]的随机整数,使用(rand() % (b-a))+ a + 1; 通用公式:a + rand() % n;其中的a是起始值,n是整数的范围。 要取得a到b之间的...

  • 利用本征图像分解(Intrinsic Image Decomposition)算法,将图像分解为shading(illumination) image 和 reflectance(albedo) image,计算图像的reflectance image。 Reflectance Image 是指在变化的光照条件下能够维持不变的图像部分...

  • 题目:面试题39. 数组中出现次数超过一半的数字 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1: 输入: [1, 2, 3, 2, 2, 2, 5, 4, 2] 输出: 2 限制: 1 <= 数组长度 <= 50000 解题: cl...

  • 题目:二叉搜索树的后序遍历序列 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。 参考以下这颗二叉搜索树:      5     /    2   6   /  1   3示例 1: 输入: [1,6,3,2,5] 输出...