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.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

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

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值