方式1:借助栈 空间辅助度是O(N)

方式2: 借助栈 空间复杂度是 O(n/2)。只存后半个链表

方式3: 反转后半个链表  最后再反转回来

 package my_basic.class_3;

 import java.util.Stack;

 //是否是回文结构  121  1221,
public class Code_11_IsPalindromeList {
public static class Node{
int value;
Node next;
public Node(int value) {
super();
this.value = value;
}
} //need extra(n) space 栈辅助
public static boolean isPalindrome1(Node head) {
Stack<Node> stack = new Stack<Node>();
Node cur = head;
while(cur != null) {
stack.push(cur);
cur = cur.next;
}
while (head != null && !stack.empty()) {
if (head.value != stack.pop().value) {
return false;
}
head = head.next;
}
if (head==null) {
System.out.println("head null");
}
return true;
} //need n/2 extra space 栈辅助
public static Boolean isPalindrome2(Node head) {
Stack<Node> stack = new Stack<Node>();
if (head == null || head.next == null) {
return true;
}
Node right = head.next;
Node cur = head;
if (cur.next!=null || cur.next.next !=null) {
cur = cur.next.next;
right = right.next;
}
while (right != null) {
stack.push(right);
right = right.next;
}
while(!stack.empty()) {
if (head.value != stack.pop().value) {
return false;
}
head = head.next;
}
return true;
} //need O(1) extra space 反转半个链表
public static Boolean isPalindrome3(Node head) {
if (head == null || head.next == null) {
return true;
}
Node n1 = head;
Node n2 = head;
while (n2.next != null && n2.next.next!=null) {
n1 = n1.next; //mid
n2 = n2.next.next; //last
}
n2 = n1.next; //右边第一个节点
n1.next = null;
Node n3 = null;
while (n2 != null) { /*反转右半部分*/
n3 = n2.next;
n2.next = n1;
n1 = n2;
n2 = n3;
}
n3 = n1; //n3->last node
n2 = head;
boolean res = true;
while (n2 != null && n1 != null) {
if (n2.value != n1.value) {
// return false; 不能return 还要把链表反转回来
res = false;
break;
}
n2 = n2.next;
n1 = n1.next;
} n1 = n3.next;
n3.next = null;
while (n1 != null) { // recover list
n2 = n1.next;
n1.next = n3;
n3 = n1;
n1 = n2;
}
return res; } public static void printLinkedList(Node node) {
System.out.print("Linked List: ");
while (node != null) {
System.out.print(node.value + " ");
node = node.next;
}
System.out.println();
} public static void main(String[] args) {
Node head = null;
head = new Node(1);
head.next = new Node(2);
head.next.next = new Node(2);
head.next.next.next = new Node(2);
// head.next.next.next.next = new Node(1);
printLinkedList(head);
System.out.print(isPalindrome1(head) + " | ");
System.out.print(isPalindrome2(head) + " | ");
System.out.print(isPalindrome3(head) + " | ");
printLinkedList(head);
System.out.println("========================="); }
}

判断一个链表是否为回文结构 【题目】 给定一个链表的头节点head,请判断该链表是否为回 文结构。 例如: 1->2->1,返回true。 1->2->2->1,返回true。 15->6->15,返回true。 1->2->3,返回false。 进阶: 如果链表长度为N,时间复杂度达到O(N),额外空间复杂 度达到O(1)。的更多相关文章

  1. 链表回文判断(C++)

    题目描述: 对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构. 给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构.保证链表长度小于等 ...

  2. 判断回文字符串、回文链表、回文数(python实现)

    所谓回文字符串,就是正读和反读都一样的字符串,比如"level"或者"noon"等等就是回文串.即是对称结构 判断回文字符串 方法一: def is_palin ...

  3. LeetCode 234:回文链表 Palindrome Linked List

    ​ 请判断一个链表是否为回文链表. Given a singly linked list, determine if it is a palindrome. 示例 1: 输入: 1->2 输出: ...

  4. LeetCode——回文链表

    题目 给定一个链表的头节点head,请判断该链表是否为回 文结构. 例如: 1->2->1,返回true. 1->2->2->1,返回true. 15->6-> ...

  5. Python生成一个不含回文字符串的字符串

    [本文出自天外归云的博客园] 回文字符串介绍 回文字符串就是对称的字符串,例如: “ABA” “ABBA” “ABCBA” 题目 给定一个字符串,请发明一种方法,让字符串中不包含回文字符串. 我的解法 ...

  6. Java 判断回文字符串有多少和其中的最大字符串

    一.简介代码功能 该代码的功能可以实现对任意的一段字符串进行判断是否有回文,回文有哪些,和其中的最大回文. 二.代码部分 1.全局变量 static String hws = "" ...

  7. 九度oj 题目1528:最长回文子串

    题目描述: 回文串就是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串. 回文子串,顾名思义,即字符串中满足回文性质的子串. 给出一个只由小写英文字符a,b,c...x, ...

  8. [Jobdu] 题目1528:最长回文子串

    题目描述: 回文串就是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串.回文子串,顾名思义,即字符串中满足回文性质的子串.给出一个只由小写英文字符a,b,c...x,y, ...

  9. C实例--推断一个字符串是否是回文数

    回文是指顺读和反读内容均同样的字符串.比如"121","ABBA","X"等. 本实例将编写函数推断字符串是否是回文. 引入两个指针变量,開 ...

随机推荐

  1. IOS Carthage安装、使用

    一.Carthage的安装和使用1.安装homebrew后输入如下命令 $ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercont ...

  2. AtCoder Beginner Contest 087 D People on a Line(DFS)

    题意 给出n个点,m组关系L,R,D,L在R的左边距离D,判断是否存在n个人的位置满足m组关系 分析 Consider the following directed graph G: There ar ...

  3. ZOJ3163【思维题】

    每天取最远的那面 int main() { init(); int n,x,y; while(~scanf("%d%d%d",&n,&x,&y)) prin ...

  4. windows 系统 GitBook生成PDF、epub报错Error during ebook generation: 'ebook-convert' 乱码

    解决方法 1. 根据你的系统下载calibre并安装 2. 右键属性打开桌面图标位置 3 .复制该路径: 4. 打开我的电脑-属性-系统-高级系统设置-环境变量,配置环境. 5. 编辑"PA ...

  5. 织梦cms 应急响应 修复建议

    通过分析log日志,可以知道攻击者的IP 攻击时间 和具体操作 本片文章为内网测试,通过分析日志,进行复现攻击流程,同时对网站的后门给予修复建议 通过分析日志可以知道,攻击者使用了扫描工具进行网站扫描 ...

  6. 上传到git

    https://blog.csdn.net/Lucky_LXG/article/details/77849212

  7. Git - .gitignore文件的用法

    .gitignore文件的作用 .gitignore文件用来忽略被指定的文件或文件夹的改动,被记录在.gitignore文件里的文件或文件夹,是无法被git跟踪到的,换句话说,被忽略的文件是不会被放入 ...

  8. PostgreSQL - update语句怎么关联多个表

    问题 对于select语句,我们可以通过join/outer join来关联多个表:但是对于update语句,是不能直接通过join/outer join来关联多表数据的,这里仅针对PostgreSQ ...

  9. idea | 设置支持java8的lambda表达式

    修改配置: setting:       project structure:

  10. IP服务-1-ARP和代理ARP

    代理ARP常被人忽视,因为现在基本不用了