判断一个链表是不是回文链表

第一种方法: 额外空间复杂度O(N) ,遍历链表时,将元素入栈,再次遍历时,从栈中弹出元素,比较两者的大小,就可以判断是不是回文链表
第二种方法:利用快慢指针,先找到链表的中间位置,然后反转链表的后半部分,再分别从链表两头遍历比较大小,最后将链表恢复为原始结构

public class PalindromeLinkedList {

    public static void main(String[] args) {

        Node head = new Node(1);
        head.next = new Node(3);
        head.next.next = new Node(5);
        head.next.next.next = new Node(5);
        head.next.next.next.next  = new Node(3);
        head.next.next.next.next.next  = new Node(1);

        display(head);

        //快指针每次走二步,慢指针每次走一步,循环结束后,当节点数量为奇数时,slow来到了中间位置,当节点数量为偶数时,slow来到了中间位置(虚线)的前一个
        Node fast = head;
        Node slow = head;
        while(fast.next != null && fast.next.next != null){
             fast = fast.next.next;
             slow = slow.next;
        }
        //这里的slow就表示中间节点,记录slow的位置
        Node middle = slow;

        //记录中间节点的下一个节点位置
        Node help = slow.next;
        //中间节点指向null
        slow.next = null;

        //从help这个节点反转链表
        Node pre = null;
        Node next = null;
        //循环结束后,pre就是最后一个节点
        while(help != null) {
            next = help.next;
            help.next = pre;
            pre = help;
            help = next;
        }

        //判断是否是回文
        boolean flag = true;
        Node  first = head;
        Node  second = pre;
        while(first != null && second != null) {
            if(first.value != second.value) {
                flag = false;
                break;
            }
           first =  first.next;
           second = second.next;
        }
        System.out.println(flag);

        //将链表恢复为原来的结构
        Node help_restore = pre;
        Node pre_restore = null;
        Node next_restore = null;
        while(help_restore != null) {
            next_restore = help_restore.next;
            help_restore.next = pre_restore;
            pre_restore = help_restore;
            help_restore = next_restore;
        }
        middle.next = pre_restore;
        display(head);

    }

    public static  void display(Node head) {
        StringBuilder sb = new StringBuilder();
        while (head != null) {
            sb.append(head.value + " -> ");
            head = head.next;
        }
        String res = sb.substring(0, sb.lastIndexOf(" -> "));
        System.out.println(res);
    }

    public static class Node{
        public int value; //值
        public Node next; // 下一个节点

        public Node(int value) {
            this.value = value;
        }
    }
}

原文地址:https://www.cnblogs.com/moris5013/p/11636879.html

时间: 2024-08-29 16:12:57

判断一个链表是不是回文链表的相关文章

【c语言】判断一个字符串是不是回文字符串

//判断一个字符串是不是回文字符串 #include <stdio.h> #include <assert.h> int panduan( char *p ) { char *q ; assert( *p != NULL ); q = p; while( *p != '\0') { p++; } p--; while(*q != '\0') { if( *p == *q) { p--; q++; } else return -1; } return 1; } int main()

【Leetcode链表】回文链表(234)

题目 请判断一个链表是否为回文链表. 示例 1: 输入: 1->2 输出: false 示例 2: 输入: 1->2->2->1 输出: true 进阶: 你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题? 解答 两种方法: 遍历链表,用数组存值,再比较.时间复杂度O(n),空间复杂度O(n) 指针法:找到中点,反转中点之后的链表,再比较.时间复杂度O(n),空间复杂度O(1) 通过代码如下: # Definition for singly-linked list.

判断一个字符串是不是回文字符串

  function isPalindrome(str) { str = str.replace(/\W/g, '').toLowerCase(); return (str == str.split('').reverse().join('')); } 先将传递进来的字符串中的除字母数字下划线之外的东西删除,并将字符串转化为小写. 然后将字符串转换为数组,目的是使用重排序方法reverse()方法,进行数组序列反转,然后再转换为字符串.与str进行比较如果相等证明是回文字符串 由于有个repla

用c语言实现 判断一个字符串是不是回文字符串

#include<stdio.h>; #include<string.h>; void huiwen( const char* str) { int i; int flag; int len=strlen(str); char *ch=str; while(*ch!='\0') { ch++; } ch--; for(i=1;i<=len/2;i++) { if(*ch==*str) { flag=1; ch--; str++; } else { printf("不

写一个少于 80 字符的函数,判断一个字符串是不是回文字符串

废话不多说,直接上代码: 1 function isPalindrome(str){ 2 return (str === str.split('').reverse().join('')); 3 } 4 5 console.log(isPalindrome('1 $bb$1')); // false 6 console.log(isPalindrome('1$bb$1')); // true

判断回文链表

我们之前有两篇文章写了回文串和回文序列相关的问题. 寻找回文串的核心思想是从中心向两端扩展: string palindrome(string& s, int l, int r) { // 防止索引越界 while (l >= 0 && r < s.size() && s[l] == s[r]) { // 向两边展开 l--; r++; } // 返回以 s[l] 和 s[r] 为中心的最长回文串 return s.substr(l + 1, r - l

如何判断一个单向链表是否为回文链表(Palindrome Linked List)

题目:给定一个单向链表,判断它是不是回文链表(即从前往后读和从后往前读是一样的).原题见下图,还要求了O(n)的时间复杂度O(1)的空间复杂度. 我的思考: 1,一看到这个题目,大脑马上想到的解决方案就是数组.遍历链表,用数组把数据存下来,然后再进行一次遍历,同时用数组反向地与之比较,这样就可以判断是否回文.这个方法时间复杂度是O(n),达到了要求,然而空间复杂度显然不满足要求.所以,开数组这一类的方法显然不是最佳的. 2,既然要满足O(1)的空间复杂度,我就想到了用一个变量来存储这些数据,恰好

判断链表是否回文,空间复杂度不多于 O(1) 时间复杂度不多于 O(n)

要判断是否是回文链表这本身不难,难就难在对那两个复杂度的要求太恶心了. 我一开始的想法是先找出链表的中点,再向两边遍历,以右结点为空作为循环结束的条件.感觉挺好哈,可是这特么是单向链表. 然后我琢磨像 12321 这样的有一个特点,就是 1 + 3 = 2 + 2 = 3 + 1 觉得我特么简直就是天才,居然发现了这么神奇的数学规律,请叫我 X 欧拉. 直到我发现了 000111 = = -> T-T -> QAQ 最终的解决方法是我看了一些博客之后总结的,就是利用递归不断地向后找,直到找到最

链表逆序+判断链表是否回文

单链表逆序详解 1.具有链表头的单链表 假设需要逆序的单链表为: 则逆序以后的链表为: 过程: (1)取p1指向header->next (p1=stu->next);p2保留p1->next(p2=p1->next);将p1->next置为NULL,因为单链表逆序以后,当前的p1节点为尾节点 p1->next=NULL; (2)取p3保留p2->next (p3=p2->next);将p2插入p1之前(p2->next = p1);p1指向p2指向的