234. 回文链表

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;
}

posted @ 2019-12-31 11:11  咸鱼呀咸鱼  阅读(118)  评论(0)    收藏  举报