/**
* 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) {
//1.寻找中间节点
ListNode mid = findMidNode(head);
//2.反转后半部分链表
mid = reverseList(mid);
ListNode temp = head;
//3.比较值
while(temp != null){
if(temp.val != mid.val) {
return false;
}
temp = temp.next;
mid = mid.next;
}
return true;
}
//寻找中间节点
public ListNode findMidNode(ListNode head) {
ListNode slow = head;
ListNode fast = head;
while(fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
}
if(fast != null)
return slow.next;
return slow;
}
//反转链表
public ListNode reverseList(ListNode head) {
ListNode pre = null;
ListNode cur = head;
while(cur != null) {
ListNode temp = cur.next;
cur.next = pre;
pre = cur;
cur = temp;
}
return pre;
}
}
leetcode回文链表,这样写为什么会出现空指针异常?
在 mid = reverseList(mid); 这一行,如果 mid 为 null,那么在调用 reverseList 方法时,会出现空指针异常。这种情况可能发生在输入的链表为空或只有一个节点时。为了避免这种情况,可以在调用 reverseList 方法前,先判断 mid 是否为 null。
在 if(temp.val != mid.val) 这一行,如果 mid 为 null,那么在访问 mid.val 时会出现空指针异常。这种情况可能发生在输入的链表长度为奇数时,且在 findMidNode 方法中,指针 fast 到达链表末尾时的位置是 null。为了避免这种情况,可以在 findMidNode 方法返回 null 时,特殊处理。例如,可以在 isPalindrome 方法中增加一个条件判断,判断 mid 是否为 null,如果是,则直接返回 false。
leetcode有可能会出现空的链表传进来,建议你在调用findMidNode之前先检查一下链表