递归问题解决思路 83. 删除排序链表中的重复元素 24. 两两交换链表中的节点 203. 移除链表元素

递归问题解决思路 案例小结

看了leetcode上一篇博主发的博客套路解决递归问题
按照他的思路用递归写了几道题目

83. 删除排序链表中的重复元素

题目:给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。

输入: 1->1->2
输出: 1->2

思路:

  • 使用递归方式解题,注重三个方面:
    • 找到整个递归的终止条件:递归应该在什么时候结束? 此题在链表遍历到最后一个元素时终止.
    • 返回值:应该给上一级返回什么信息?此题应该返回已经处理好的链表
    • 单次递归的任务:本次递归应该做什么?比较相邻的2个节点,若值相同,则删除一个

代码:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    
    
    public ListNode deleteDuplicates(ListNode head) {
    
    
        //当链表遍历结束时,递归终止
        if(head == null || head.next == null){
    
    
            return head;
        }
        //获取此次递归任务需要的值(通常包含上一次递归产生的值)
        //此次递归任务是比较head节点和head.next节点的值
        //而head.next节点来自于上一次递归的结果
        head.next = deleteDuplicates(head.next);
        //指向此次递归的任务
        if(head.val == head.next.val){
    
    
            //删除head,将head指针指向next
            head = head.next;
        }
        //此次递归处理的结果是head,将此次结果返回,供上一层次的递归调用
        return head;
    }
}

24. 两两交换链表中的节点

题目:给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。

你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

给定 1->2->3->4, 你应该返回 2->1->4->3.

思路:

  • 使用递归方式解题,注重三个方面:
    • 找到整个递归的终止条件:递归应该在什么时候结束? 此题在链表遍历到最后一个元素时终止.
    • 返回值:应该给上一级返回什么信息?此题应该返回已经处理好的链表
    • 单次递归的任务:本次递归应该做什么?此题一轮交换需要2个连续的节点,故此次一轮递归需要3个节点,head,head.next,和已经处理好的链表

代码:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    
    
    public ListNode swapPairs(ListNode head) {
    
    
        //当链表遍历结束时,递归终止
        if(head == null || head.next == null){
    
    
            return head;
        }
        //获取此次递归任务需要的值(通常包含上一次递归产生的值)
        //此次递归任务是交换head节点和head.next节点
        ListNode next = head.next;
        //使用下一对节点的第一个节点作为参数,返回已经处理好的链表
        ListNode result=swapPairs(next.next);
        //完成本次递归的任务:执行交换
        head.next = result;
        next.next = head;
        return next;
    }
}

203. 移除链表元素

题目:删除链表中等于给定值 val 的所有节点。

输入: 1->2->6->3->4->5->6, val = 6
输出: 1->2->3->4->5

思路:

  • 使用递归方式解题,注重三个方面:
    • 找到整个递归的终止条件:递归应该在什么时候结束? 此题在链表遍历到最后一个元素时终止.
    • 返回值:应该给上一级返回什么信息?此题应该返回已经处理好的链表.
    • 单次递归的任务:本次递归应该做什么?此题本轮递归需要判断head的val部分是否等于给定的val,如果相等,则丢弃head,head = head.next

代码:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    
    
    public ListNode removeElements(ListNode head, int val) {
    
    
        //当链表遍历结束时,递归终止
        if(head == null){
    
    
            return head;
        }
        //获取此次递归任务需要的值(通常包含上一次递归产生的值)
        head.next = removeElements(head.next,val);
        //此次递归只涉及到一个变量head, 当head值等于val,则丢弃head,返回已经处理好的head.next 对象.
        if(head.val == val){
    
    
            return head.next;
        }
        return head;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_44634197/article/details/108431713
今日推荐