LeetCode——回文链表
Posted Shaw_喆宇
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode——回文链表相关的知识,希望对你有一定的参考价值。
Q:请判断一个链表是否为回文链表。
示例 1:
输入: 1->2
输出: false
示例 2:
输入: 1->2->2->1
输出: true
A:
1.reverse以后对比。
因为这里是递归reverse,所以之前要先复制一个原链表。
public boolean isPalindrome(ListNode head) {
if (head == null || head.next == null)
return true;
ListNode node = head.next;
ListNode head1 = new ListNode(head.val);
ListNode temp = head1;
while(node!=null){
int val = node.val;
temp.next = new ListNode(val);
temp = temp.next;
node = node.next;
}
ListNode head2 = reverse(head);
ListNode node1 = head1;
ListNode node2 = head2;
while (node1 != null) {
if (node1.val != node2.val)
return false;
node1 = node1.next;
node2 = node2.next;
}
return true;
}
private ListNode reverse(ListNode head) {
if (head == null || head.next == null)
return head;
ListNode node = reverse(head.next);
head.next.next = head;
head.next = null;
return node;
}
2.双指针
主要是找到中点再reverse,我觉得这样就没什么意思了……
private ListNode reverse(ListNode head) {
if (head == null || head.next == null)
return head;
ListNode node = reverse(head.next);
head.next.next = head;
head.next = null;
return node;
}
public boolean isPalindrome(ListNode head) {
if (head == null || head.next == null)
return true;
ListNode slow = head;
ListNode fast = head.next;
while (fast != null && fast.next != null) {//找到中点,如果是偶数,为前一个点
slow = slow.next;
fast = fast.next.next;
}
fast = reverse(slow.next);
slow.next = null;//cut前后两段
slow = head;
while(fast!=null){//这里一定要是fast的长度,fast是后半段,slow是前半段,若为奇数长度链表,slow更长
if(slow.val!=fast.val)
return false;
slow = slow.next;
fast = fast.next;
}
return true;
}
以上是关于LeetCode——回文链表的主要内容,如果未能解决你的问题,请参考以下文章