中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

LeetCode如何判斷回文鏈表

發布時間:2021-12-04 15:47:16 來源:億速云 閱讀:135 作者:小新 欄目:大數據

這篇文章給大家分享的是有關LeetCode如何判斷回文鏈表的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

 

題目描述:

請判斷一個鏈表是否為回文鏈表。

 

示例 1:

輸入: 1->2輸出: false

 

示例 2:

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

 

思路分析:

 

迭代法:

避免使用 O(n)O(n) 額外空間的方法就是改變輸入。

我們可以將鏈表的前(后)半部分反轉(修改鏈表結構),然后將前半部分和后半部分進行比較。比較完成后我們應該將鏈表恢復原樣。雖然不需要恢復也能通過測試用例,但是使用該函數的人通常不希望鏈表結構被更改。

該方法雖然可以將空間復雜度降到 O(1)O(1),但是在并發環境下,該方法也有缺點。在并發環境下,函數運行時需要鎖定其他線程或進程對鏈表的訪問,因為在函數執行過程中鏈表會被修改。

整個流程可以分為以下步驟:

找到前(后)半部分鏈表的尾節點。
反轉(前)后半部分鏈表。
判斷是否回文。

 

Python實現

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def isPalindrome(self, head):
        """
        :type head: ListNode
        :rtype: bool
        """
        if head is None or head.next is None:
            return True
        if head.next.next is None:
            return head.val == head.next.val
        fast = slow = q = head
        while fast.next and fast.next.next:#這里快指針的判讀條件跟判斷環形有一點不同
            fast = fast.next.next
            slow = slow.next
        def reverse_list(head):
            if head is None:
                return head
            cur = head
            pre = None
            nxt = cur.next
            while nxt:
                cur.next = pre
                pre = cur
                cur = nxt
                nxt = nxt.next
            cur.next = pre
            return cur
        p = reverse_list(slow.next)
        while p.next:
            if p.val != q.val:
                return False
            p = p.next
            q = q.next
        return p.val == q.val
   

java實現:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public boolean isPalindrome(ListNode head) {
        if(head == null || head.next == null) {
            return true;
        }
        ListNode slow=head;
        ListNode fast=head;
        ListNode pre=null,prepre=null;
       //反轉前半部分指針
        while(fast!=null&&fast.next!=null){
            pre=slow;
            slow=slow.next;
            fast=fast.next.next;
            pre.next=prepre;
            prepre=pre;
        }
        if(fast != null) {
            slow = slow.next;
        }
       //比較前后部分指針是否相同
        while(pre!=null&&slow!=null){
            if(pre.val!=slow.val){
                return false;
            }
            pre=pre.next;
            slow=slow.next;
        }
        return true; 
    }
}
   

遞歸法:

currentNode 指針是先到尾節點,由于遞歸的特性再從后往前進行比較。frontPointer 是遞歸函數外的指針。若 currentNode.val != frontPointer.val 則返回 false。反之,frontPointer 向前移動并返回 true。

算法的正確性在于遞歸處理節點的順序是相反的,而我們在函數外又記錄了一個變量,因此從本質上,我們同時在正向和逆向迭代匹配。

所謂遞歸,即從上往下遞下去,然后再從下往上歸回來。

 

java實現代碼:

class Solution {
    private ListNode frontPointer;

    private boolean recursivelyCheck(ListNode currentNode) {
        if (currentNode != null) {
            if (!recursivelyCheck(currentNode.next)) {
                return false;
            }
            if (currentNode.val != frontPointer.val) {
                return false;
            }
            frontPointer = frontPointer.next;
        }
        return true;
    }

    public boolean isPalindrome(ListNode head) {
        frontPointer = head;
        return recursivelyCheck(head);
    }

感謝各位的閱讀!關于“LeetCode如何判斷回文鏈表”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

旺苍县| 虹口区| 成都市| 临漳县| 万载县| 寿光市| 溆浦县| 开封县| 梅河口市| 陈巴尔虎旗| 通化县| 杭锦后旗| 托里县| 红安县| 丹东市| 曲水县| 浙江省| 浮山县| 福贡县| 清流县| 新竹市| 家居| 东安县| 兴安盟| 赤壁市| 萨迦县| 锡林浩特市| 江川县| 延长县| 威信县| 施秉县| 小金县| 习水县| 社旗县| 怀宁县| 迁西县| 满城县| 晋中市| 东光县| 韶山市| 宁夏|