1. 什么是回文
- 回文指正读和反读都相同的字符序列为“回文”,如“abba”、“abccba”、12321、123321是“回文”,“abcde”和“ababab”则不是“回文”。
2. 什么是单链表
- 单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始;链表是使用指针进行构造的列表;又称为结点列表,因为链表是由一个个结点组装起来的;其中每个结点都有指针成员变量指向列表中的下一个结点;
- 链表是由结点构成,head指针指向第一个成为表头结点,而终止于最后一个指向NULL的指针。
3. Java代码实现
public boolean isPalindrome(Node head) {
if (head == null) return false;
Node slow = head; //慢指针
Node fast = head; //快指针
//如果快指针没有到链表末尾则进入循环
while (fast.next != null && fast.next.next != null) {
slow = slow .next;
fast = fast .next.next;
}
//当循环结束,此时 slow 为中间结点
//如果fast 的下一个结点为空 则代表此链表为奇数 否则为偶数
Node leftLink = null;
Node rightLink = null;
if (fast.next == null) {
//奇数个,slow为中间结点
rightLink = slow.next;
leftLink = reversal_5(slow).next;
} else {
//偶数个,slow为中间结点之一
rightLink = slow.next;
leftLink = reversal_5(slow);
}
return isEquals(leftLink, rightLink);
}
public Node reversal_5(Node p) {
//三指针法反转链表
// Node beg = null;
// Node mid = head;
// Node end = head.next;
// while (end != p) {
// mid.next = beg;
// beg = mid;
// mid = end;
// end = end.next;
// }
// mid.next = beg;
// end.next = mid;
// mid = end;
// return mid;
//头插法
Node head = this.head;
Node newHead = null;
Node tmp = null;
while (head != p) {
tmp = head;
head = head.next;
tmp.next = newHead;
newHead = tmp;
}
//再赋值的原因:当head==p时未进入循环,少一次赋值
head.next = newHead;
newHead = head;
return newHead;
}
public boolean isEquals(Node leftLink, Node rightLink) {
Node l = leftLink;
Node r = rightLink;
boolean flag = true;
while (l != null && r != null) {
if (l.data == r.data) {
l = l.next;
r = r.next;
continue;
} else {
flag = false;
break;
}
}
return flag;
}
public class Node {
private int data;
private Node next;
public Node(int data, Node next) {
this.data = data;
this.next = next;
}
public int getData() {
return data;
}
}
4. 写在最后
- 如果文章内有不正确的地方欢迎大家指正;
- 希望和大家一起在编程路上的共同学习、进步。