(LeetCode 234)Palindrome Linked List

Leetcode第234题目是Palindrome Linked List。题目的描述如下:

Given a singly linked list, determine if it is a palindrome.

Follow up:
Could you do it in O(n) time and O(1) space?


解法思想:

首先题目是说给定一个单链表,判断是否为回文的。要求为时间复杂度为O(n) ,空间复杂度为O(1) 。

解法思想为找到链表的中间节点,然后将后面的半部分反转过来,最后拆成两个链表,再比较。

代码部分如下所示:

public class Solution {
    public boolean isPalindrome(ListNode head) {
		//如果为空或者只有一个节点则判定为回文
		if( head == null || head.next == null ){
			return true;
		}
		//下面部分计算链表长度,并且将最后一个节点
		//保存为链表2的头head2
		int len = 1;
		ListNode p = head,head2;
		while( p.next != null ){
			len++;
			p = p.next;
		}
		head2 = p;
		
		int i = 0;
		p = head;
		while( i != len/2 ){
			p = p.next;
			i++;
		} //移动到链表中间节点
		//从中间节点开始将其拆成链表2,并且反转
		ListNode tail = p;
		ListNode q = p.next;
		while( q != null ){
			ListNode r = q.next;
			q.next = p;
			p = q;
			q = r;
		}
		tail.next = null;
		//开始比较两段链表,判断是否为回文链表
		ListNode m = head, n = head2;
		while( m != null && n != null ){
			if( m.val != n.val ){
				return false;
			}
			m = m.next;
			n = n.next;
		}
		return true;
	}
}


你可能感兴趣的:(java,LeetCode,list,linked)