递归实现---------链表

//链表本身是具有天然递归性。
public class LinkedListRecursion<E> implements List<E> {
	
	private class Node{
		E data;		//数据域
		Node next;	//指针域
		public Node(){
			this(null,null);
		}
		public Node(E data,Node next){
			this.data=data;
			this.next=next;
		}
		@Override
		public String toString() {
			return data.toString();
		}
	}
	private Node head;	//指向虚拟头结点的头指针
	private Node rear;	//指向尾结点的尾指针
	private int size;	//记录元素的个数
	
	public LinkedListRecursion() {
		head=new Node();
		rear=head;
		size=0;
	}
	
	@Override
	public int getSize() {
		return size;
	}

	@Override
	public boolean isEmpty() {
		return size==0&&head.next==null;
	}



	@Override
	public void add(int index, E e) {
		if(index<0||index>size){
			throw new IllegalArgumentException("插入角标非法!");
		}
		Node n=new Node(e,null);
		if(index==0){	//头插
			n.next=head.next;
			head.next=n;
			if(size==0){
				rear=n;
			}
		}else if(index==size){	//尾插
			rear.next=n;
			rear=rear.next;
		}else{	//一般插入             
			head.next=add(head.next,0,index,n); //调用辅助函数
		}
		size++;
	}
	/**
	 * 以节点p为头结点的链表中插入结点n
	 * i只当前p的角标
	 * index插入结点的位置
	 * */
	private Node add(Node p,int i,int index,Node n){
		if(i==index-1){
			n.next=p.next;
			p.next=n;
		}else{
			p.next=add(p.next,i+1,index,n);
		}
		return p;
	}
	@Override
	public void addFirst(E e) {
		add(0,e);
	}

	@Override
	public void addLast(E e) {
		add(size,e);
	}

	@Override
	public E get(int index) {
		if(index<0||index>=size){
			throw new IllegalArgumentException("查找角标非法!");
		}
		if(index==0){	//获取头
			return head.next.data;
		}else if(index==size-1){	//获取尾
			return rear.data;
		}else{	//获取中间
			return get(head.next,0,index);
		}
	}
	/**
	 * 返回以p为头结点的链表中 角标在index处的结点元素
	 * i表示当前p的角标
	 * */
	//人用迭代 神用递归
	private E get(Node p,int i,int index){
		if(i==index){
			return p.data;
		}else{
			return get(p.next,i+1,index);
		}
	}
	@Override
	public E getFirst() {
		return get(0);
	}

	@Override
	public E getLast() {
		return get(size-1);
	}

	@Override
	public void set(int index, E e) {
		if(index<0||index>=size){
			throw new IllegalArgumentException("修改角标非法!");
		}
		if(index==0){	//改头
			head.next.data=e;
		}else if(index==size-1){	//改尾
			rear.data=e;
		}else{
			set(head.next,0,index,e);
		}
	}
	private void set(Node p,int i,int index,E e){
		if(i==index){
			p.data=e;
		}else{
			set(p.next,i+1,index,e);
		}
	}
	@Override
	public boolean contains(E e) {
		return find(e)!=-1;
	}

	@Override
	public int find(E e) {
		if(isEmpty()){
			return -1;
		}
		
		return find(head.next,0,e);
	}

	private int find(Node p,int i,E e){
		if(p==null){
			return -1;
		}else{
			if(p.data==e){
				return i;
			}else{
				return find(p.next,i+1,e);
			}
		}
	}
	
	@Override
	public E remove(int index) {
		if(index<0||index>=size){
			throw new IllegalArgumentException("删除角标非法!");
		}
		E res=null;
		if(index==0){	//头删
			Node p=head.next;
			res=p.data;
			head.next=p.next;
			p.next=null;
			p=null;
			if(size==1){
				rear=head;
			}
		}else{
			head.next=remove(head.next,0,index);
		}
		size--;
		return res;
	}
	private Node remove(Node p,int i,int index){
		if(i==index-1){
			System.out.println(">>>"+p.next.data);
			p.next=p.next.next;
			if(index==size-1){
				rear=p;
			}
		}else{
			p.next=remove(p.next, i+1, index);
		}
		return p;
	}
	@Override
	public E removeFirst() {
		return remove(0);
	}

	@Override
	public E removeLast() {
		return remove(size-1);
	}

	@Override
	public void removeElement(E e) {
		
	}

	@Override
	public void clear() {
		
	}
	@Override
	public String toString() {
		StringBuilder sb=new StringBuilder();
		sb.append("LinkedList:size="+getSize()+"\n");
		if(isEmpty()){
			sb.append("[]");
		}else{
			sb.append("[");
			Node p=head;
			while(p.next!=null){
				p=p.next;
				if(p==rear){
					sb.append(p.data+"]");
				}else{
					sb.append(p.data+",");
				}
			}
		}
		return sb.toString();
	}
}

插入代码递归:

//链表使用 虚拟头结点去是实现的
private Node add(Node p , int i , int index , Node n){
//递归的边界
	if( i == index -1 ){ //当前 i 是  index位置的前驱  即 index -1 的位置
		n.next = p.next;
		p.next = n;
	}else{
		p.next = add(p.next , i+ 1 , index ,n);
	}
 return p;


}

最后返回一个 链表 这个表 是 添加完后的表
在这里插入图片描述
在这里插入图片描述

//用辅助函数
privat E get(Node p , int i ,int  index){ //返回角标所在结点的 数据
	if( i == index){
		return p.data;
	}else{
		return get(p.next , i+1 , index)		
	}


}

在这里插入图片描述

//set 和 get方法 相似

private void set(Node p , int i , int index , E e)[
	if( i == index){
	p.data = e;

	}else{
		set(p.next , i + 1 , index ,e);
	}


}

```java
public int find(E e){
	if( isEmpty()){
		return -1;
	}
	return find(head.next,0,e);

}
//先找节点 如果结点存在的话 ,去判断 是否 存在这个数据 
private int find(Node p , int i ,E e){
	if(p == null){
		return -1;


	}else{
		if( p.data == e){
		return i;
		}else{
			return find(p.next , i+ 1 ,e);
		}
	}



}
//删除  删除尾 1.需查2.需删  一般删1.需查2.需删  所以一起写
//返回的是一个 数 ,但是改变了链表 所以也要返回 结点  那么如何处理
private Node  remove(Node p , int i , int index){
	if(i == index - 1){
		System.out.println("---" + p.next.data);
		p.next = p.next.next;
		if(index == size -1){
 			rear = p;
		}
	}else{
		p.next = reamove(p.next , i+ 1 , index);

	}

	return p;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值