java递归删除链表_关于单链表的增删改查方法的递归实现(JAVA语言实现)

1 public class LinkedList>{2 //链表节点内部类

3 private classNode{4 E e;5 Node next;6 publicNode(E _e,Node _next){7 this.e =_e;8 this.next =_next;9 }10 publicNode(E _e){11 this(_e, null);12 }13 publicNode(){14 this(null, null);15 }16 }17 //头节点

18 privateNode head;19 //链表实际存储大小

20 private intsize;21 //无参构造函数

22 publicLinekedList(){23 this.head = null;24 this.size = 0;25 }26 //判断链表是否为空

27 public booleanisEmpty(){28 return this.size == 0;29 }30 public intsize(){31 return this.size;32 }33 //在链表头添加节点

34 public voidaddFirst(E e){35 add(0, e);36 }37 //在链表尾添加节点

38 public voidaddLast(E e){39 add(size, e);40 }41 //在链表指定位置添加节点

42 public void add(intindex,E e){43 if (index < 0 || index >size) {44 throw new IllegalArgumentException("Index is error.");45 }46 head =add(index, e, head);47 }48 //通过递归实现链表的添加

49 private Node add(intindex,E e,Node node){50 if (index == 0 && node == null) {51 this.size++;52 return newNode(e);53 }54 if (index == 0) {55 this.size++;56 Node newNode = newNode(e);57 //newNode.next = node.next;

58 newNode.next =node;59 //node.next = newNode;

60 returnnewNode;61 }62 node.next = add(index - 1, e, node.next);63 returnnode;64 }65 /**

66 * 用于根据索引查找对应的节点,67 *@paramindex68 *@paramnode69 *@return相应的节点对象70 */

71 private Node getElementByIndex(intindex,Node node){72 if (index == 0 && node != null) {73 returnnode;74 }75 Node ret = getElementByIndex(index - 1, node.next);76 returnret;77 }78 //删除链表头节点

79 publicE removeFirst(){80 return remove(0);81 }82 //删除链表尾结点

83 publicE removeLast(){84 return remove(size - 1);85 }86 //删除指定位置节点,并返回删除节点值

87 public E remove(intindex){88 if(isEmpty()) {89 throw new IllegalArgumentException("List is empty.");90 }91 if (index < 0 || index >=size) {92 throw new IllegalArgumentException("Index is error.");93 }94 Node ret =getElementByIndex(index, head);95 head =remove(index, head);96 returnret.e;97 }98 //递归删除节点值

99 private Node remove(intindex,Node node){100 if (node == null) {101 returnnode;102 }103 if (index == 0) {104 Node delNode =node;105 node =delNode.next;106 delNode.next = null;107 this.size--;108 returnnode;109 }110 node.next = remove(index - 1, node.next);111 returnnode;112 }113 //修改指定位置节点的值,通过递归实现

114 public void set(intindex,E e){115 if(isEmpty()) {116 throw new IllegalArgumentException("List is empty.");117 }118 if (index < 0 || index >=size) {119 throw new IllegalArgumentException("Index is error.");120 }121 set(index, e, head);122 }123 private void set(intindex,E e,Node node){124 if (node == null) {125 return;126 }127 if (index == 0) {128 node.e =e;129 }130 set(index - 1, e, node.next);131 return;132 }133 //获取链表头节点的值

134 publicE getFirst(){135 return get(0);136 }137 //获取链表尾结点的值

138 publicE getLast(){139 return get(size - 1);140 }141 //获取链表制定位置的值,通过递归实现

142 public E get(intindex){143 if(isEmpty()) {144 throw new IllegalArgumentException("List is empty.");145 }146 if (index < 0 || index >=size) {147 throw new IllegalArgumentException("Index is error.");148 }149 returnget(index, head).e;150 }151 private Node get(intindex,Node node){152 if (node == null) {153 returnnode;154 }155 if (index == 0) {156 returnnode;157 }158 Node ret = get(index - 1, node.next);159 returnret;160 }161 //查询链表中的节点是否包含值e

162 public booleancontains(E e){163 returncontains(e, head);164 }165 private booleancontains(E e,Node node){166 if (node == null) {167 return false;168 }169 if (node.e ==e) {170 return true;171 }172 returncontains(e, node.next);173 }174 //重写Object类的toString方法:也是通过链表天然的递归性,来访问175 //链表的每一个节点

176 @Override177 publicString toString() {178 StringBuilder res = newStringBuilder();179 res.append("Font -> ");180 linkToString(head, res);181 returnres.toString();182 }183 private voidlinkToString(Node node,StringBuilder res){184 if (node == null) {185 res.append("NULL");186 return;187 }188 res.append(node.e + " -> ");189 linkToString(node.next, res);190 return;191 }192

193 /*public static void main(String[] args) {194 LinekedList ll = new LinekedList<>();195 for (int i = 0; i < 13; i++) {196 ll.addLast(i);197 System.out.println(ll.toString());198 }199 System.out.println("------------------");200 for (int i = 0; i < 11; i++) {201 Integer ii = ll.removeFirst();202 System.out.println(ii);203 System.out.println(ll.toString());204 }205

206 }*/

207 }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值