返回

内卷大厂三连击:揭秘链表反转之奥义

后端

1. 链表反转的基本思路

链表反转的核心思想是将链表中每个节点的指针指向发生改变,从而达到反转链表的目的。具体来说,需要做的步骤如下:

  • 首先,定义两个指针变量:precur,其中pre指向当前节点的前一个节点,cur指向当前节点。
  • 初始化prenullcur为链表头节点。
  • 进入循环,每次循环将cur指向的当前节点的下一个节点赋值给pre,再将cur指向pre,最后将cur指向当前节点的下一个节点。
  • 重复以上步骤,直到curnull,此时链表已经反转完成。

通过上述步骤,可以实现链表的反转。需要注意的是,在循环过程中,需要保证precur始终指向相邻的两个节点,否则链表将无法正确反转。

2. 三种常见的链表反转算法

2.1 头插法

头插法是一种简单有效的链表反转算法。其核心思想是将每个节点从链表尾部取下,然后插入到链表头部,以此类推,直到所有节点都插入到链表头部,此时链表就反转完成了。

头插法的实现步骤如下:

  • 首先,定义两个指针变量:headcur,其中head指向链表头节点,cur指向当前节点。
  • 初始化cur为链表头节点。
  • 进入循环,每次循环将cur指向的当前节点的下一个节点赋值给head,再将cur指向head,最后将head指向当前节点。
  • 重复以上步骤,直到curnull,此时链表已经反转完成。

2.2 尾插法

尾插法与头插法类似,但其核心思想是将每个节点从链表头部取下,然后插入到链表尾部,以此类推,直到所有节点都插入到链表尾部,此时链表就反转完成了。

尾插法的实现步骤如下:

  • 首先,定义三个指针变量:headcurtail,其中head指向链表头节点,cur指向当前节点,tail指向链表尾节点。
  • 初始化cur为链表头节点,tail为链表尾节点。
  • 进入循环,每次循环将cur指向的当前节点的下一个节点赋值给tail,再将cur指向tail,最后将tail指向当前节点。
  • 重复以上步骤,直到curnull,此时链表已经反转完成。

2.3 迭代法

迭代法是另一种常见的链表反转算法。其核心思想是利用一个栈来存储链表中的节点,然后逐个弹出栈中的节点并将其插入到链表头部,以此类推,直到栈中没有节点,此时链表就反转完成了。

迭代法的实现步骤如下:

  • 首先,定义一个栈,并将其初始化为空。
  • 然后,定义两个指针变量:headcur,其中head指向链表头节点,cur指向当前节点。
  • 进入循环,每次循环将cur指向的当前节点入栈,再将cur指向cur的下一个节点。
  • 重复以上步骤,直到curnull,此时栈中已经包含了链表中的所有节点。
  • 将栈中的节点逐个弹出并插入到链表头部,以此类推,直到栈中没有节点,此时链表已经反转完成。

3. 结语

链表反转是大厂面试中高频出现的问题,也是检验程序员基本功的试金石。通过本文的学习,相信大家已经掌握了链表反转的基本原理和三种常见的反转算法。在实际面试中,可以根据面试官的要求选择合适