用递归实现单向链表

链表具有天然的递归性。
如图:
用递归实现单向链表_第1张图片

对于链表的递归我们可以理解为:
对于任何一个节点,它后面可以挂接另一个链表。
该节点的后继节点可以当成另外一个链表的头结点。

在这里我们写的是单向循环链表的递归。同样的,它要实现我们之前写过的List接口的方法,并且要有一个节点的内部类。
这里我们从虚拟头结点开始。

1.LinkedListRecursion()类

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

2.getSize()类

@Override
	public int getSize() {
   
		return size;
	}

这里直接返回size就可以了

3.isEmpty()类

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

判断是否为空,让size等于0就可以了,不放心可以让虚拟头节点的后继节点为null就可以了。

3.add()类

添加的函数里,分为头插、尾插和一般插入。
头插、尾插和之前写的LinkedList()类里面一样,而一般插入就需要用递归
如图:
用递归实现单向链表_第2张图片
图中表达的很清楚。

1.当我们要在下标为2的位置插入节点时,让P从下标为0的位置开始查找,找到下标2位置的前一个节点。
2.找到前一个节点后,把新的节点插入进去,然后返回下标为1的红色的P节点,红色的P节点是被黑色的P节点接收的,然后把黑色的P节点返回给head.next(虚拟头结点)。

通过这样一层层的递进找到位置,然后再逐层返回,等于是重新给链表构造了关系。
这样就实现了递归的性质,调用函数自身找到插入节点的前一个节点位置,插入新节点后逐层返回。

让我来看代码:

@Override
	public void add(int index, E e) {
   
		if(index<0||index>size){
   
			throw new IllegalArgumentException(

你可能感兴趣的:(数据结构与算法,知识点,递归实现单向链表)