本文正在参加「Java主题月 - Java 刷题打卡」,详情查看 活动链接
题目描述
回文链表
请判断一个链表是否为回文链表
示例 1:
输入: 1->2
输出: false
示例 2:
输入: 1->2->2->1
输出: true
进阶:
你能否用时间复杂度是,空间复杂度是来解决此题?
思路分析
像这种回文类的项目,很容易就想到用双指针解法来解答,我们先遍历一遍该链表,得出链表长度,然后再遍历到指定位置时,反转后面的链表,最后进行一一比较,判断是否为回文链表
代码展示
双指针解法,时间复杂度是,空间复杂度也是。
// 234 回文链表
public boolean isPalindrome(ListNode head) { //1,2,3,4 //1,2,3
if (head == null || head.next == null){
return true;
}
ListNode p = head;
int count = 0;
while (p != null){
p = p.next;
count++;
}
p = head;
//对奇数和偶数分别进行处理
int m = count/2;
if (count % 2 != 0){
m = m + 1;
}
while (p != null && m > 0){
m--;
p = p.next;
}
ListNode tempNode = reverseList(p);
while (tempNode != null && head != null){
if (tempNode.val != head.val){
return false;
}
tempNode = tempNode.next;
head = head.next;
}
return true;
}
反转链表的解法如下:
// 206 reverse list
public ListNode reverseList(ListNode head) { //1,2,3
ListNode prev = null;
ListNode current = head;
while (current != null){
ListNode next = current.next;
current.next = prev;
prev = current;
current = next;
}
return prev;
}
总结
在遇到回文字符串/链表等相关题目时,要优先考虑使用双指针解法,同时链表反转也是一个必须掌握的知识,在很多链表相关题目会用到。