本文旨在通过使用递归方法的使用来进一步了解递归思想

class Solution {
    public ListNode removeElements(ListNode head, int val) {
        if (head == null) {
            return head;
        }
        head.next = removeElements(head.next, val);
        return head.val == val ? head.next : head;
    }
}
既然要使用递归算法,那么就要对于递归有一定的了解:
递归的三个特点
- 有终止条件
- 自身调用
- 从上往下解决问题
“有终止条件”
在本题中,终止条件就是head == null。
一个节点接一个节点地往后判断,当后移一位时节点变为null时,说明已经到链表末尾了。递归结束,
“自身调用”与“从上到下”
对于本题中 removeElements(ListNode head, int val) 方法的含义是:获取-对于给定的头节点为head的链表,删除节点值为val的节点后-的新的头节点
对于第一个节点来说,以它为头节点的链表经过删除后的新的头节点要么是它本身,要么是它后面一长串链表的头节点。
即 removeElements(head.next, int val)
于是我们就达到了“自身调用”和“从上到下”的要求
代码解析
public class LC01 {
     public class ListNode {
         int val;
         ListNode next;
         ListNode() {}
         ListNode(int val) { this.val = val; }
         ListNode(int val, ListNode next) { this.val = val; this.next = next; }
     }
     
    class Solution {
        public ListNode removeElements(ListNode head, int val) {
            //终止条件
            if (head == null) {
                return head;
            }
            //自身调用
            head.next = removeElements(head.next, val);
            //如果head的节点值为val,那么新的头节点为head.next,否则为head
            return head.val == val ? head.next : head;
        }
    }
}



















