判断一个单链表是不是回文,主要有三种方法,不过如果要考虑空间复杂度的话,就只有常用的一种方法了。

这种方法很考验一个人的细心以及编程能力~

前两种方法比较简单我就不祥述了~

主要讲一下最后一种方法:直接上图了~

下面附上code:

public static class Node {
public int value;
public Node next;

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

public static void main(String args[]) {
Node head = new Node(1);
head.next = new Node(2);
head.next.next = new Node(3);
head.next.next.next = new Node(3);
head.next.next.next.next = new Node(2);
head.next.next.next.next.next = new Node(1);
printLinkedList(head);
isHuiWenList1(head);
isHuiWenList2(head);
isHuiWenList3(head);
}

/* 打印单链表 */
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();
}

/*
* 需要额外空间复杂度O(n),这种方法在笔试中比较推荐。 大概四路如下: 新建一个堆栈,把list里面的元素一个一个        push进入堆栈中,全部都放进去以后,
* pop出来与单链表中的元素取出来进行比较,如果完全相等,则说明是回文,不然不是
*/
public static boolean isHuiWenList1(Node head) {
if (head == null || head.next == null) {
return true;
}
Stack<Node> st = new Stack<Node>();
Node cur = head;
/* 将元素压入堆栈 */
while (cur != null) {
st.push(cur);
cur = cur.next;
}
/* 判断单链表中的元素是否与堆栈pop出来的元素相等 */
while (head != null) {
if (head.value != st.pop().value) {
System.out.println("false");
return false;
} else {
head = head.next;
}
}
System.out.println("true");
return true;
}

/*
* 这种方法其实不怎么推荐,虽然它额外空间复杂度是O(n/2),但是编程相对来说有点难度,不过这里涉及到一种常用的思想:
* 定义一个指针,slow和fast,slow一次走一步,fast一次走两步,同时走,当fast走完全程的时候,slow刚好就在中点。
* 其他思想与方法一类似,也是定义一个堆栈,把单链表的元素放进去,再把它pop出来进行比较。
*/
public static boolean isHuiWenList2(Node head) {
Node fast = head;
Node slow = head;
if (head == null || head.next == null) {
return true;
}
/* 从这里开始走,一个走一步,一个走两步 */
if (fast.next != null && fast.next.next != null) {
fast = fast.next.next;
slow = slow.next;
}
/* 下面的slow此时是中点 */
Stack<Node> st = new Stack<Node>();
while (slow != null) {
st.push(slow);
slow = slow.next;
}
while (st.size() != 0) {
if (st.pop().value != head.value) {
System.out.println("false");
return false;
} else {
head = head.next;
}
}
System.out.println("true");
return true;
}

/*
* 下面这种方法空间复杂度为o(1),适合于在笔试中使用,很考验编程能力,主要是在逆序那里很容易出错, 不过一旦理解了这种思想,逆序就不难理解了!
*/
public static boolean isHuiWenList3(Node head) {
if (head == null || head.next == null) {
System.out.println("true");
return true;
}

/* 找中点位置,也是通过两个指针来实现 */
Node slow = head;
Node fast = head;
while (fast.next != null && fast.next.next != null) {
slow = slow.next;
fast = fast.next.next;
}

/* 将中点右边的单链表进行逆序 */
Node n3 = null;
fast = slow.next;
slow.next = null;
while (fast != null) {
n3 = fast.next;
fast.next = slow;
slow = fast;
fast = n3;
}
/* 比较中点左边的元素和中点右边的元素是否相等,也即判断是否为回文 */
n3 = slow;
fast = head;
boolean res = true;
while (slow != null && fast != null) {
if (slow.value != fast.value) {
res = false;
break;
}
slow = slow.next;
fast = fast.next;
}
/* 将中点右边逆序的部分恢复过来,其实这里我也不太懂为什么要恢复过来,欢迎各位大神能来解答一下 */
slow = n3.next;
n3.next = null;
while (slow != null) {
fast = slow.next;
slow.next = n3;
n3 = slow;
slow = fast;
}
System.out.println(res);
return res;
}

透彻理解回文~单链表的逆序~相关推荐

  1. 单链表实现一元多项式相加_python面试系列 01如何实现单链表的逆序

    题目介绍 来源:腾讯笔试                         难度系数:★★★☆☆                  考察频率:★★★★☆ 题目描述: 给定一个带头结点的单链表,请将其逆序 ...

  2. 单链表的逆序java_java 实现单链表的逆序

    package com.ckw.mianshi; /** * java 实现单链表的逆序 * @author Administrator * */ public class SingleLinkedR ...

  3. 【数据结构】单链表的逆序输出(两种方法)

    第一种方法:转换指针方向 即:将一个已经创建好的单链表进行指针域的改变 今天突然被问到单链表逆序的问题,弄了好久才看出别人的程序有啥问题,就重新写了一遍. 今天才在CSDN客户端上看到美团的面试题是冒 ...

  4. Java实现单链表的逆序打印

    思路1:可以将链表进行反转,然后进行数据的输出即可,单链表反转地址如下https://blog.csdn.net/Kevinnsm/article/details/113763272 这个思路1肯定有 ...

  5. (二十四) 单链表的逆置(java)

    前言:单链表的逆置总是看完博客,当时懂了过一段时间就忘了,还是动手写一下加深一下印象吧. 参考博客:点击打开链接 demo地址:我的github 1. 单链表 先写一个简单的单链表,改写一下它的toS ...

  6. 大厂面试算法系列-如何实现链表的逆序(二)-递归法

    导语   接着上次的内容,上次博客中展示了原地进行单链表的逆序操作,当然除了原地逆序还可以通过递归的方式进行调用操作.下面就来看看通过递归的方式如何进行单链表的逆序操作. 递归法逆序链表   假定原来 ...

  7. 大厂面试算法系列-如何实现链表的逆序(一)-原地逆序

    题目描述   给定一个带有头节点的单向列表,将这个链表进行逆序.例如head->1->3->4->2,逆序之后变成head->2->4->3->1 题目 ...

  8. 如何实现链表的逆序?

    如何实现链表的逆序? 下面介绍了两种方法:1.就地逆序法 2.插入法 单链表数据结构 /*** @program: 算法与数据结构* @description: 单链表数据结构* @author: 粉 ...

  9. 头插法逆置单向链表c语言,单链表的逆置(头插法和就地逆置)

    今天课间的时候偶然看到了一个面试题:单链表的逆置,看了题解感觉乖乖的,貌似和以前看的版本不搭,于是重新进行了一番探究 单链表的逆置分为两种方法:头插法和就地逆置法,这两种方法虽然都能够达到逆置的效果, ...

最新文章

  1. 如果让学生轻松过关,他们就对老师心存轻蔑
  2. C ++中的POD类型是什么?
  3. Kinect开发笔记之三Kinect开发环境配置详解
  4. 网站能拿到其他网站的cookie_在网站推广中企业网站能发挥哪些作用?(一)
  5. 开启阿里云对象存储OSS防误删新功能,保护您珍贵的数据。
  6. redis 配置文件参数详解
  7. XStream实现缓存
  8. Windows Server 2008官方(MSDN)简体中文正式版试用心得
  9. NOD32 AntiVirus v2.70.16杀毒软件
  10. Vue - 超详细最新 WangEditor V5 富文本编辑器安装引入及使用教程(内含在 Nuxt.js 项目中引入的解决方案)
  11. 普中V2 7人多数表决器 51单片机 仿真 proteus
  12. 读取自定义配置文件属性值
  13. Illustrator CS3自学实例高清视频教程
  14. matlab如何用二分法求函数零点,用二分法求函数的零点及二分法定义
  15. python去除图片背景_Python 图片去除背景
  16. Vue-element-admin 基础模板
  17. 回文数,回文字符串的判断
  18. 【Vue】win10启动vue项目报错: errno: -4058, code: ‘ENOENT‘, syscall: ‘spawn cmd‘
  19. 优秀课程案例:使用Scratch制作坦克大战增强版!
  20. python图片马赛克_python检测图片是否有马赛克内容

热门文章

  1. python函数示例_带Python示例的float()函数
  2. 保姆级教程,终于搞懂脏读、幻读和不可重复读了!(经典回顾)
  3. 操作系统Ubuntu(实验三四)
  4. Python函数定义变量报错:local variable ‘a‘ referenced before assignment
  5. 安装composer以及laravel框架
  6. 公开说说别人看不到_当听到别人在说自己坏话时,心里是什么感受?
  7. MyEclipes 设置代码自动提示
  8. 思科CCNA第一学期期末考试答案
  9. iphone文件怎么上传到服务器,iPhone编程中文件上传到HTTP服务器
  10. 华为二层创建vlan_二层交换机不同VLAN实现互通 (华为)