Palindrome Linked List

来源:互联网 发布:数据接口标准 编辑:程序博客网 时间:2024/07/24 01:40

Given a singly linked list, determine if it is a palindrome.

Follow up:

Could you do it in O(n) time and O(1) space?

  • Difficulty: Easy


思路:判断一个链表是否是回文结构

例如:1->2->3->2->1  是

   1->2->3->1       否

方法一将链表的值一次性全部压栈,然后弹出和原链表的值进行比对,如果全部相同,则是回文结构。

              时间复杂度O(n)  使用了N个额外空间。

         


方法二使用两个指针快指针和满指针,快指针一次走两步,并将慢指针压栈,当快指针走到最后结点时,慢指针正好到达链表的中间位置(如何找到链表中间位置的方法),此时,如果慢指针遍历的个数是基数,则不压栈。然后,慢指针继续移动并和栈中弹出的值对比。如果相同则是回文结构。

此方法相当于只使用的方法一一半的内存空间。故时间复杂度是O(k/2).


方法三:最优解:

找到中间点,然后将链表后半部分做逆序调整。从链表头尾向中间遍历对比。此方法不必申请额外的空间。时间复杂度O(n)   .

            


/** * Definition for singly-linked list. * public class ListNode { *     int val; *     ListNode next; *     ListNode(int x) { val = x; } * } */public class Solution {    public boolean isPalindrome(ListNode head) {        if(head == null) {            return true;        }        ListNode p1 = head;        ListNode p2 = head;        ListNode p3 = p1.next;        ListNode pre = p1;        //find mid pointer, and reverse head half part        while(p2.next != null && p2.next.next != null) {            p2 = p2.next.next;            pre = p1;            p1 = p3;            p3 = p3.next;            p1.next = pre;        }        //odd number of elements, need left move p1 one step        if(p2.next == null) {            p1 = p1.next;        }        else {   //even number of elements, do nothing                    }        //compare from mid to head/tail        while(p3 != null) {            if(p1.val != p3.val) {                return false;            }            p1 = p1.next;            p3 = p3.next;        }        return true;            }}


 

0 0
原创粉丝点击