LeetCode 234:Palindrome Linked List
Posted 一只菜鸡的奋斗史
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 234:Palindrome Linked List相关的知识,希望对你有一定的参考价值。
题意描述
给定一个单链表,确定它是否是回文。
测试用例
Input: 1->2
Output: false
Input: 1->2->2->1
Output: true
解题思路
一、思路一
- 使用快慢指针,快指针fast一次走两步,慢指针slow一次走一步。当fast走到尾部时,slow走到链表中间。
- 将后半段链表反转,slow指向反转链表的头部,fast指向旧链表的头部
- 逐个比较新旧链表的值,如果不相等,则返回false;如果节点为奇数,也会返回false,因为中间的节点无法匹配。
class Solution {
public boolean isPalindrome(ListNode head) {
if(head == null) return true;
ListNode fast = head;
ListNode slow = head;
//fast走到尾部,slow走到中间
while(fast != null && fast.next != null){
fast = fast.next.next;
slow = slow.next;
}
slow = reserver(slow); //反转
fast = head;
//逐个比较
while(slow != null){
if(fast.val != slow.val){
return false;
}
fast = fast.next;
slow = slow.next;
}
return true;
}
//头插法反转
private ListNode reserver(ListNode head){
ListNode node = null;
while(head != null){
ListNode next = head.next;
head.next = node;
node = head;
head = next;
}
return node;
}
}
二、思路二
利用递归
- 先使用临时节点递归遍历到链表尾部。
- 判断尾部元素与链表头部元素是否相等,如果相等,返回true,向上回溯至(i-1)层。
- 继续判断第二个元素与(i-1)是否相等
class Solution {
ListNode node;
public boolean isPalindrome(ListNode head) {
node = head;
return check(head);
}
private boolean check(ListNode head){
if(head == null) return true;
boolean ans = check(head.next); //如果遍历到尾部,向上回溯返回true
boolean iseq = (node.val == head.val) ? true : false; //第i个元素与(n-i)个元素比较
node = node.next;
return ans && iseq;
}
}
以上是关于LeetCode 234:Palindrome Linked List的主要内容,如果未能解决你的问题,请参考以下文章
Leetcode 234. Palindrome Linked List
Java [Leetcode 234]Palindrome Linked List
LeetCode 234. Palindrome Linked List
leetcode 234. Palindrome Linked List