zoukankan      html  css  js  c++  java
  • Leetcode Palindrome Linked List

    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?


    根据回文串的特点,我们需要比较对应位置的值是否相等,那么我们首先需要找到链表的中点,这个可以用快慢指针来实现。使用快慢指针找中点的原理是fast和slow两个指针,每次快指针走两步,慢指针走一步,等快指针走完时,慢指针的位置就是中点。

    方法一解题思路:

    用栈,每次慢指针走一步,都把值存入栈中,等到达中点时,链表的前半段都存入栈中了,由于栈的后进先出的性质,就可以和后半段链表按照回文对应的顺序比较了。

    但没法做到 O(1) space ,因此方法二才完全满足要求,事实上,方法二所需的运行时间的确小很多。

    方法二解题思路:

    1). 使用快慢指针寻找链表中点

    2). 将链表的后半部分就地逆置,然后比对前后两半的元素是否一致

    3). 恢复原始链表的结构(可选)


    java code

     1 import java.util.Stack;
     2 
     3 public class PalindromeLinkedList {
     4     public class ListNode {
     5         int val;
     6         ListNode next;
     7         ListNode(int x) { val = x; }
     8     }
     9 
    10     /*
    11     method1: use stack to save the first half linked list
    12     use fast and slow pointer, when fast pointer reaches the end, slow pointer       reaches the middle of LinkedList
    13     * */
    14     public boolean isPalindrome(ListNode head) {
    15         if(head == null || head.next == null) { return true;}
    16         ListNode slow = head, fast = head;
    17         Stack<Integer> s = new Stack<Integer>();
    18         s.push(head.val);
    19         //find middle node
    20         while(fast.next != null && fast.next.next != null) {
    21             slow = slow.next;
    22             fast = fast.next.next;
    23             s.push(slow.val);
    24         }
    25         if(fast.next == null) {s.pop();}
    26         while(slow.next != null) {
    27             slow = slow.next;
    28             int tmp = s.peek();
    29             s.pop();
    30             if(tmp != slow.val) { return false; }
    31         }
    32         return true;
    33 
    34     }
    35 
    36     /*
    37     * method2
    38     */
    39     public boolean isPalindrome(ListNode head) {
    40         if(head == null || head.next == null) { return true;}
    41         ListNode slow = head, fast = head;
    42         //find middle node
    43         while(fast.next != null && fast.next.next != null) {
    44             slow = slow.next;
    45             fast = fast.next.next;
    46         }
    47         //reverse the second half linked list
    48         ListNode last = slow.next, pre = head;
    49         while(last.next != null ) {
    50             ListNode tmp = last.next;
    51             last.next = tmp.next;
    52             tmp.next = slow.next;
    53             slow.next = tmp;
    54         }
    55         while(slow.next != null) {
    56             slow = slow.next;
    57             if(pre.val != slow.val) return false;
    58             pre = pre.next;
    59         }
    60         return true;
    61     }
    62 
    63 }    

    Reference:

    1. http://bookshadow.com/weblog/2015/07/10/leetcode-palindrome-linked-list/

    2. http://www.cnblogs.com/grandyang/p/4635425.html

  • 相关阅读:
    delphi之动态库调用和串口通讯
    git如何使用 svn如何使用
    delphi学习笔记1
    sql
    linux连接与传输等命令
    jdbc
    list/tstringlist/tobjectlist
    SQL GRANT
    Invalidate介绍
    FORM 的创建
  • 原文地址:https://www.cnblogs.com/anne-vista/p/4791090.html
Copyright © 2011-2022 走看看