234. 迴文鏈表

請判斷一個鏈表是否爲迴文鏈表。

示例 1:

輸入: 1->2
輸出: false

示例 2:

輸入: 1->2->2->1
輸出: true

思路: 

          首先建立兩個指針指向鏈表,然後使其中一個指針指向鏈表中間,這裏可以使用另一個指針快速移動,當另一個指針移動速度是前一根指針的一倍時,就可以使slow指針到一半,而fast指針遍歷完了。使用棧接收前一半的所有數據,因爲要判斷是否迴文,所以前一半顛倒和後一半比較,如果相等則說明是迴文鏈表。而棧的後進先出恰好符合了這個特性。代碼如下:

/**
 * 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) {
            ListNode fast = head;
            ListNode slow = head;
            Stack<int> value = new Stack<int>();
            //使鏈表快速遍歷 讓slow到達鏈表一半
            while (fast != null && fast.next != null) {
                value.Push(slow.val);
                slow = slow.next;
                fast = fast.next.next;
            }
            //如果fast不爲空則節點數是爲奇數,因爲當前slow需要指向鏈表的後半部分所以需要後移
            if (fast != null) {
                slow = slow.next;   
            }
            while (slow !=null)
            {
                int v = value.Pop();
                if (v != slow.val) {
                    return false;
                }
                slow = slow.next;
            }
            return true;
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章