递归问题解决思路 案例小结
看了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;
}
}