1. 题目:
请判断一个链表是否为回文链表。
示例1:
输入: 1->2
输出: false
示例2:
输入: 1->2->2->1
输出: true
2. 思路:
设置两个快慢指针,快指针走到链表末尾时,慢指针恰好在链表中间节点,翻转后半部分链表,逐一比对两个链表的数值是否相等。
3. 代码:
ListNode preNode = new ListNode(-1);
preNode.next = head;
ListNode slow = preNode;
ListNode fast = preNode;
//慢指针走一步,快指针走两步
while (fast != null && fast.next != null){
slow = slow.next;
fast = fast.next.next;
}
ListNode node1 = null;
//快指针指向慢指针下一个,并断开链表
fast = slow.next;
slow.next = null;
//翻转链表
while (fast != null) {
ListNode nextTemp = fast.next;
fast.next = node1;
node1 = fast;
if (nextTemp != null){
fast = nextTemp;
}else {
break;
}
}
slow = preNode.next;
//逐一比较两个链表值是否相等
while (fast != null){
if (fast.val == slow.val){
slow = slow.next;
fast = fast.next;
}else {
return false;
}
}
return true;
}