---
# System prepended metadata

title: 234. Palindrome Linked List
tags: [LeetCode]

---

---
tags: LeetCode
---

# 234. Palindrome Linked List
Given a singly linked list, determine if it is a palindrome.

Example 1:
```
Input: 1->2
Output: false
```

Example 2:
```
Input: 1->2->2->1
Output: true
```
Follow up:    
Could you do it in O(n) time and O(1) space?




輸入範本如下
```C#
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     public int val;
 *     public ListNode next;
 *     public ListNode(int x) { val = x; }
 * }
 */
public class Solution {
    public bool IsPalindrome(ListNode head) {
        
    }
}
```
---

### 直覺想法

1. 若兩倍速走的指標走到了終點 , 則一倍速走的指標必定在整段 LinkedList 的中間. 再使用 [206. Reverse Linked List](https://hackmd.io/CC-tH5eaQmuesbWvZmN_OQ?view) 的方法 , 反轉剩下半個 List , 從頭尾兩點 , 開始走訪 , 判斷是否值都相等. 若否 , 不是迴文.
    ```C#
    104 ms	28 MB
    You are here!
    Your runtime beats 61.98 % of csharp submissions.
    public bool IsPalindrome(ListNode head)
    {
        ListNode turtle = head, rabbit = head;
        while (rabbit != null && rabbit.next != null)
        {
            turtle = turtle.next;
            rabbit = rabbit.next.next;
        }
        // turtle 再整段 List 的中間.
        // 反轉剩下半段 List , 並取得最後一點的 point.
        ListNode reverseStart = ReverseList(turtle);
        // 逐一比對值是否都相等. , 因為反轉的關西 , head 那頭的 list 走訪會有 cycle.
        for (; reverseStart != null; head = head.next, reverseStart = reverseStart.next)
        {
            if (head.val != reverseStart.val)
            {
                return false;
            }
        }
        return true;

        ListNode ReverseList(ListNode node)
        {
            ListNode pre = null;
            while (node != null)
            {
                ListNode next = node.next;
                node.next = pre;
                pre = node;
                node = next;
            }
            return pre;
        }
    }
    ```

2. 將所有的值都存入 List 內. 剩下就是 two point 的方式去判斷是否回文 , 會使用比上一個方式還要多的記憶體.
    ```C#
    100 ms	29.3 MB
    You are here!
    Your runtime beats 84.50 % of csharp submissions.
    public bool IsPalindrome(ListNode head)
    {
        List<ListNode> list = new List<ListNode>();
        for (; head != null; head = head.next)
        {
            list.Add(head);
        }

        for (int l = 0, r = list.Count - 1; l < r; l++, r--)
        {
            if (list[l].val != list[r].val)
            {
                return false;
            }
        }
        return true;
    }
    ```









### Thank you! 

You can find me on

- [GitHub](https://github.com/s0920832252)
- [Facebook](https://www.facebook.com/fourtune.chen)

若有謬誤 , 煩請告知 , 新手發帖請多包涵

# :100: :muscle: :tada: :sheep: 
