反转链表系列总结
链表类型的题目,一直以来是面试必考的题型。考查的核心有两点:
一、思路的考察,如快慢双指针、递归反转、环的入口等。
二、对指针的处理细节,如头尾节点、反转节点指针等
往往只有两者结合,才能正确解决链表问题。否则容易出现没有思路,或者有了思路但却不知道如何正确处理指针走向,导致解题失败。
在链表面试题中,反转链表更是一个热门+必问考点。全链表反转属于基础,由此延伸出的问题更是五花八门。对于这类问题,如果没有正确解答,往往宣告面试的结束。
本专题总结了链表反转的六大题型,希望大家看完之后,都可以轻松解决面试中遇到的链表问题,拿到心仪的offer。
反转链表相关题目列表:
1. 反转整个链表 2. 反转链表前n个节点 3. 反转链表后n个节点 4. 反转部分链表 5. 反转相邻链表 6. 反转链表k个一组 7. 判断链表是否回文结构
1.反转整个链表
非递归方式利用了pre和next指针,保存前驱节点用于反转,后继节点用于循环。 反转循环过程核心为三步: 1. 保存后继节点 2. 反转当前节点 3. 指针后移继续循环
/**
* 1.反转整个链表 非递归
*/
public ListNode reverseAllList(ListNode head) {
ListNode pre = null;
ListNode next;
while (head != null) {
next = head.next;
head.next = pre;
pre = head;
head = next;
}
return pre;
}链表反转递归方式为经典的体现递归题目。要明确递归反转的方法含义,即反转head为头节点的链表,返回反转之后的头节点。回到方法中,此时last节点指向的,是以head.next为头节点的链表,反转之后的头节点。然后进行指针的反转,并且末尾指向NULL。注意递归的终止条件为head.next == null,但是防止入参为空,所以需要加上head == null判断。
2.反转链表前n个节点
非递归方法:理解了全链表反转,该题只需要注意指针的处理。反转前n个节点,需要保存第n+1个节点,与反转后的前N个节点链表进行拼接。
递归方法类似全链表反转,注意递归的终止条件
3.反转链表后n个节点
4.反转部分链表
反转部分链表,从第from个节点到第to个节点,则需要有指向第from-1个节点的指针startPre,指向to节点的指针end。而我们需要的start节点和to的后节点,均可通过两者后移得到。 注意: from是1的情况,此时返回的头节点不再是原来的头节点,而是反转后的头节点。
5.反转相邻链表
在头节点前设置前驱节点dummy,每次循环取得cur节点的后两个节点,设为p、q,反转pq的指针。注意调整的顺序。
6.K个一组反转链表
结合全链表反转,将链表分成K个一组进行全链表反转,反转完成后再拼接回原链表中,继续下一轮循环。
7.判断链表是否回文结构
反转链表后半部分,与前半部分链表逐一比较判断是否回文。判断完成后再将后半部分链表反转回去
Last updated
Was this helpful?