以前大多在二叉树进行深搜或者回溯算法的时候使用递归,现在回来复习,发现链表也是一种很好的适合使用递归的数据结构。
递归三部曲:结束条件判断,递归,处理
203. 移除链表元素 - 力扣(LeetCode) (leetcode-cn.com)
(1)和数组一样,使用双指针,right!=val时,赋值给left++,等于的时候只有right++
(2)迭代,使用虚拟头节点,while循环判断
(3)递归
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;
}
}
206. 反转链表 - 力扣(LeetCode) (leetcode-cn.com)
迭代:
class Solution {
public ListNode reverseList(ListNode head) {
ListNode prev = null;
ListNode curr = head;
while (curr != null) {
ListNode next = curr.next;
curr.next = prev;
prev = curr;
curr = next;
}
return prev;
}
}
递归:
class Solution {
public ListNode reverseList(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode newHead = reverseList(head.next);
head.next.next = head;
head.next = null;
return newHead;
}
}
24. 两两交换链表中的节点 - 力扣(LeetCode) (leetcode-cn.com)
迭代
class Solution {
public ListNode swapPairs(ListNode head) {
ListNode dummyHead = new ListNode(0);
dummyHead.next = head;
ListNode temp = dummyHead;
while (temp.next != null && temp.next.next != null) {
ListNode node1 = temp.next;
ListNode node2 = temp.next.next;
temp.next = node2;
node1.next = node2.next;
node2.next = node1;
temp = node1;
}
return dummyHead.next;
}
}
递归
class Solution {
public ListNode swapPairs(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode newHead = head.next;
head.next = swapPairs(newHead.next);
newHead.next = head;
return newHead;
}
}