学习目标:
本次学习目标为 力扣初级算法-链表,其中主要的LC如下:
- 回文链表
学习内容:
- 回文链表 -----(链接)
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。示例1:
输入:head = [1,2,2,1]
输出:true示例2:
输入:head = [1,2]
输出:false说明:
链表中节点数目在范围[1, 105] 内
0 <= Node.val <= 9
解题思路:
-
解法一: 常规解法
-
边界问题:删除位大于入参的链表的长度 或者直接删除首结点的情况
-
代码逻辑过程:
- 大概的思路是通过链表找到中间点,然后把链表分为两部分,将后面的链表反转,然后再将前部分的链表和反转后的链表作比较,当一致时,则是回文链表。
- 注意点: 快指针 直接跳两个节点,方便用于统计当前节点的数量是技术还是偶数,同时可以快速找到中点位置
-
代码实现:
/**
* 解法一 :直接解法
*/
public boolean isPalindrome01(ListNode head) {
ListNode fastNode = head;
ListNode slowNode = head;
// 单次一个跳跃两个点,一个跳跃一个点
while (null != fastNode && null!= fastNode.next){
fastNode = fastNode.next.next;
slowNode = slowNode.next;
}
// fastNode 不为空,说明链表的长度位基数,若是 fastNode.next 不为空,则说明链表的长度位偶数
if (null != fastNode){
slowNode = slowNode.next;
}
slowNode = reverse(slowNode);
fastNode = head;
while (null != slowNode){
if (fastNode.val != slowNode.val){
return false;
}
fastNode = fastNode.next;
slowNode = slowNode.next;
}
return true;
}
解题思路:
-
解法二: 使用栈解决
-
边界问题:删除位大于入参的链表的长度 或者直接删除首结点的情况
-
代码逻辑过程:
- 栈的特性是先进后出的一种数据结构,使用栈先把链表的节点全部存放到栈中,然后再一个个出栈,这样就相当于链表从后往前访问了
-
代码实现:
public boolean isPalindrome02(ListNode head) {
ListNode temp = head;
Stack<Integer> stack = new Stack<>();
// 统一入栈
while (null != temp){
stack.push(temp.val);
temp = temp.next;
}
// 统一出栈,将出栈的值与链表的值做比较
while (null != head){
if (head.val != stack.pop()){
return false;
}
head = head.next;
}
return true;
}
解题思路:
-
解法三: 递归
-
边界问题:删除位大于入参的链表的长度 或者直接删除首结点的情况
-
代码实现:
/**
* 解法三 :递归方式解决
* 递归两个要素 跳出条件 与 相同调用
*/
ListNode temp;
public boolean isPalindrome03(ListNode head) {
temp = head;
return check(head);
}
private boolean check(ListNode head) {
if ( null == head){
return true;
}
boolean res = check(head.next) && head.val == temp.val;
temp = temp.next;
return res;
}
学习笔记:
回文链表:
回文链表就是以链表中间为中心点两边对称,