回文链表
题目描述:
leetcode 234.回文链表
请判断一个链表是否为回文链表。
示例 1:
输入: 1->2
输出: false
示例 2:
输入: 1->2->2->1
输出: true
进阶:
你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?
问题分析:
回文的思想就是前后比较,找出不同返回false,不然返回true。
回文链表的回文有两种类型方法:
1,把链表的数据存放在ArrayList中,然后借助前后指针进行比较
2,找到链表的中点,更改前半部分链表的方向,从中点开始,进行循环遍历比较
代码展示(已验证):
//leetcode 234.回文链表
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public boolean isPalindrome(ListNode head) {
第一种方法: ArrayList数组存储数据,然后进行比较
// 第一种方法: ArrayList数组存储数据,然后进行比较
if(head==null || head.next==null)
return true;
//创建一个数组对象用来存储数据
ArrayList<Integer> arr = new ArrayList<Integer>();
//进行数据赋值
while (head!=null)
{
arr.add(head.val);
head = head.next;
}
//设置两个指针
int i=0;
int j=arr.size()-1;
//进行比较判定
while(i<j)
{
if(arr.get(i).compareTo(arr.get(j))!=0) {
return false;
}
i++;
j--;
}
return true;
第二种方法:寻找链表中点,更改前半部分链表方向,循环遍历进行比较
//第二种方法:寻找链表中点,更改前半部分链表方向
if(head == null || head.next == null) {
return true;
}
//快慢指针,寻找链表中点
ListNode slow = head, fast = head;
//更改前半部分指向,等同于从中间开始向两边循环比较
ListNode pre = head, prepre = null;
while(fast != null && fast.next != null) {
pre = slow;
slow = slow.next;
fast = fast.next.next;
pre.next = prepre;
prepre = pre;
}
//slow结点就是中点
if(fast != null) {
slow = slow.next;
}
//比较是否相等
while(pre != null && slow != null) {
if(pre.val != slow.val) {
return false;
}
pre = pre.next;
slow = slow.next;
}
return true;
}
}
泡泡:
这里出现的关于链表的中点寻找方法和链表反向的方法是值得我们注意的,
通过快慢指针找到中点,根据fast.next是否等于null,决定slow是否前移一位,一次使得slow是中点的位置
通过next的转向完成链表的反向
关于对链表反向的认识,可以点击下面的链接去看一下,收工