算法刷题笔记-链表的后续遍历

文章目录

  • 一、基本框架
    • 1.1 二叉树遍历方式
    • 1.2 链表遍历方式
  • 二、典型例题
    • 2.1 引例
    • 2.2 回文链表
  • 参考

一、基本框架

1.1 二叉树遍历方式

void traverse(TreeNode root) {
    // 前序遍历代码
    traverse(root.left);
    // 中序遍历代码
    traverse(root.right);
    // 后序遍历代码
}

1.2 链表遍历方式

void traverse(ListNode head) {
    // 前序遍历代码
    traverse(head.next);
    // 后序遍历代码
}

二、典型例题

2.1 引例

/* 顺序打印单链表中的元素值 */
void traverse(ListNode head) {
	// base case
    if (head == null) return;
    // 前序遍历代码
    print(head.val);
    traverse(head.next);
}
/* 倒序打印单链表中的元素值 */
void traverse(ListNode head) {
	// base case
    if (head == null) return;
    traverse(head.next);
    // 后序遍历代码
    print(head.val);
}
  • 理解:顺序打印相当于执行完print语句后,进入下一个递归,直到遍历完链表。而倒序打印相当于先进入递归的最后一层,即链表的尾部null,再一层层往回走,每走一层,执行一次print语句,如此便实现倒序遍历。
  • 总结:做题直接套用遍历框架,记住后续遍历位置的代码执行完一次后,头结点往回走一个节点即可。

2.2 回文链表

LeetCode 234. 回文链表

// 左侧指针
ListNode left;

boolean isPalindrome(ListNode head) {
    left = head;
    return traverse(head);
}

boolean traverse(ListNode right) {
	// base case
    if (right == null) return true;
    boolean res = traverse(right.next);
    // 后序遍历代码
    res = res && (right.val == left.val);
    left = left.next;
    return res;
}
  • 套用引例的总结,这里后续遍历位置的代码执行一次,right往左移动一个节点,在这里写上left = left.next,便可实现一次递归后,left和right各反向移动一个节点,如此便可利用right.val == left.val判断回文链表了。

参考

 labuladong的算法小抄
 LeetCode 234. 回文链表

你可能感兴趣的:(面试专栏,链表,算法,leetcode)