2020.10.26每日复习

面试题02.06 回文链表(进阶)

在这里插入图片描述

分析

  • 将链表从中间对半开,前半部分从后往前遍历,后半部分照常遍历,判断两者每一位上的值是否相等,若有一位不相等,则说明不是回文链表。
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public boolean isPalindrome(ListNode head) {
    	//若链表为空或只有一位,则均为true
    	if(head == null || head.next == null) return true;
		int len = 0;
		ListNode colon = head;
		while(colon != null) { //计算链表长度
			colon = colon.next;
			len++;
		}
		if(len == 2) return head.val == head.next.val;
		ListNode pre = head;
		ListNode mid = head.next;
		ListNode cur = head.next.next;
		pre.next = null;
		//将前半部分的链表进行翻转,以期达到和后半部分链表相同的元素排序
		//翻转前半部分链表。比如 1->2->3->3->2->1,将其翻转为1<-2<-3 3->2->1。链表长度为奇数时不用管最中间的那个节点。
		for(int i = 1; i < len / 2; i++) {
			//本质就是把mid的指针指向前一个元素pre,就可以实现链表翻转
			mid.next = pre;
			pre = mid;
			mid = cur;
			cur = cur.next;
		}
		//翻转完毕后,如果链表长度为偶数,pre正好指向前半个链表的表头,mid正好指向后半个链表的表头
        //如果链表长度为奇数,pre指向前半个链表的表头,cur指向后半个链表的表头,mid指向最中间的节点。
        //所以把mid指向cur的那个节点,奇偶两种情况就可以共用下面的while循环了。
		if(len % 2 != 0) {
			mid = cur;
		} 
		while(pre != null && mid != null) {
			if(pre.val != mid.val) return false;
			pre = pre.next;
			mid = mid.next;
		}
		return true;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值