1.题目: (回文链表)
给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。
2. 示例
3.解答步骤
思路都在注释上! 请大家自主阅读程序!
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public boolean isPalindrome(ListNode head) {
// 通过快慢指针的方法做
// 这样可以迅速找到中间节点
// 然后通过判断快指针是否为null判断链表的元素个数为奇数还是偶数
// 创建两个指针(快指针fast,慢指针slow)
ListNode fast, slow;
// 快慢指针均从head开始
fast = slow = head;
// 寻找中间结点
while(fast != null && fast.next != null) {
fast = fast.next.next;
slow = slow.next;
}
// 通过快指针是否为null,判断链表的奇偶个数
// 如果链表个数为奇数个,则慢指针要继续移动一个
if(fast != null)
slow = slow.next;
// 接收后半部分的翻转过来的链表
slow = reserveHeadInsert(slow);
fast = head;
// 然后对比 slow 和 slow 相同位置的数是否相等
// 循环结束条件是 head2 == null
while (slow != null) {
if(fast.val != slow.val) {
// 假如在循环过程中出现了不等的情况
// 说明不是回文链表
return false;
}
// 比较下一个
fast = fast.next;
slow = slow.next;
}
// 循环跑完如果出现不了中途结束函数,表示是回文链表
return true;
}
// 翻转链表
public ListNode reserveHeadInsert(ListNode head) {
// 创建一个保存倒叙的链表tempHead
// 将传进来的头结点依次保存到此链表的头部
// 当此链表跑完后, 此链表便保存了传进来的链表的倒序了
// 倒叙结点
ListNode tempHead = null;
while(head != null) {
// 先保存一下 下一个结点
ListNode tempNode = head.next;
// 此结点插入到头部
head.next = tempHead;
// 然后让翻转链表的头结点 为刚才插入到头部的结点
tempHead = head;
// head 指向开始自己保存的下一个结点
head = tempNode;
}
// 当循环结束的时候返回tempHead即可
return tempHead;
}
}