• LeetCode 234. Palindrome Linked List


    原题链接在这里:https://leetcode.com/problems/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?

    题解:

    原题要求time O(n), space O(1). 所以不能用额外空间。

    先找到中点, reverse中点后面的list部分,再与head开始逐个比较val. 其中reverse部分可以参见Reverse Linked List.

    Time Complexity: O(n). Space O(1).

    AC Java:

     1 /**
     2  * Definition for singly-linked list.
     3  * public class ListNode {
     4  *     int val;
     5  *     ListNode next;
     6  *     ListNode(int x) { val = x; }
     7  * }
     8  */
     9 class Solution {
    10     public boolean isPalindrome(ListNode head) {
    11         if(head == null || head.next == null){
    12             return true;
    13         }
    14         
    15         ListNode mid = findMid(head);
    16         ListNode midNext = mid.next;
    17         mid.next = null;
    18         
    19         midNext = reverse(midNext);
    20         
    21         while(head != null && midNext != null){
    22             if(head.val != midNext.val){
    23                 return false;
    24             }
    25             
    26             head = head.next;
    27             midNext = midNext.next;
    28         }
    29         
    30         return true;
    31     }
    32     
    33     private ListNode findMid(ListNode head){
    34         if(head == null || head.next == null){
    35             return head;
    36         }
    37         
    38         ListNode runner = head;
    39         ListNode walker = head;
    40         while(runner.next != null && runner.next.next != null){
    41             walker = walker.next;
    42             runner = runner.next.next;
    43         }
    44         
    45         return walker;
    46     }
    47     
    48     private ListNode reverse(ListNode head){
    49         if(head == null || head.next == null){
    50             return head;
    51         }
    52         
    53         ListNode tail = head;
    54         ListNode cur = tail;
    55         ListNode pre;
    56         ListNode temp;
    57         while(tail.next != null){
    58             pre = cur;
    59             cur = tail.next;
    60             temp = cur.next;
    61             cur.next = pre;
    62             tail.next = temp;
    63         }
    64         
    65         return cur;
    66     }
    67 }
  • 相关阅读:
    RecyclerView 下拉刷新上拉加载
    Android 添加、移除和判断 桌面快捷方式图标
    似曾相识的 RecyclerView
    http 需要掌握的知识点(一)
    android 数据存储操作之SQLite
    Android 图片加载[常见开源项目汇总]
    Android 命名规范和编码规范
    线程池及增长策略和拒绝策略
    静态代理和动态代理的区别
    FastJson学习
  • 原文地址:https://www.cnblogs.com/Dylan-Java-NYC/p/4825011.html
Copyright © 2020-2023  润新知