01链表上:如何判断一个字符串是否是回文字符串?如果这个字符串是用单链表存储的呢?

思考:如何判断一个字符串是否是回文字符串?如果这个字符串是用单链表存储的呢?

(1) 如何判断一个字符串是否是回文字符串(仅考虑字母和数字,但字符串中可能包含其他字符)?

解法1:思路:双指针法

时间复杂度o(n),空间复杂度o(1)

具体代码如下:

class Solution {
    public boolean isPalindrome(String s) {
        int len = s.length();
        int left = 0;
        int right = len-1;
        while(left

(2) 如果这个字符串是用单链表存储的呢(考虑所有字符)?

思路:快慢指针法

(1)慢指针每次向前走一步,快指针每次向前走两步

(2)慢指针向前走的同时修改其指针指向,使得前半个序列反向。

(3)比较前半个序列和后半个序列是否相等即可

算法时间复杂度为o(n),空间复杂度为o(1)

具体代码如下:

public class ListNode{
    char val;
    ListNode next;
    ListNode(char x){
        val = x;
    }
}

class Solution{
    public boolean isPalindrome(ListNode head){
        if(head==null||head.next==null){
            return true;
        }
        ListNode slow = head;
        ListNode fast = head;
        ListNode pre =null;
        while(fast!=null&&fast.next!=null){
            fast = fast.next.next;
            ListNode next = slow.next;// 记住slow的下一个节点,因为下一步要进行断链操作
            slow.next = pre;          //断链操作
            pre = slow;
            slow = next;
        }
        if(fast!=null){      //链表节点奇数个
            slow = slow.next;   //向后移一位
        }
        while(slow!=null){
           if(slow.val != pre.val){         //依次比较前后两个序列
               return false;
            }
            slow = slow.next;
            pre=pre.next;
            }
        }
        return true;
    }
}

 

你可能感兴趣的:(算法,leetcode)