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?

Subscribe to see which companies asked this question.


思路:获得链表的长度,逆置其中的后半部分的链表,对比两个链表


public boolean isPalindrome(ListNode head) {

		if (head == null || head.next == null) {
			return true;
		}

		// 获得链表的长度
		int len = 0;
		ListNode listNode = head;
		while (listNode != null) {
			len++;
			listNode = listNode.next;
		}

		int l = len / 2 - 1;
		ListNode p1, p2;
		p1 = head;
		p2 = p1.next;
		l--;
		while (l-- > 0) {
			p1 = p2;
			p2 = p2.next;
		}
		// 当链表的长度是奇数的时候
		if (len % 2 != 0) {
			p2 = p2.next;
		}

		// 逆置链表的一般
		p1.next = null;
		ListNode q1;
		q1 = p2.next;
		p2.next = null;
		while (q1 != null) {
			ListNode t = q1.next;
			q1.next = p2;
			p2 = q1;
			q1 = t;
		}

		// 比较两个链表
		while (p2 != null && head != null) {
			if (p2.val != head.val) {
				return false;
			}
			p2 = p2.next;
			head = head.next;
		}
		return true;
	}



但是LeetCode里面的大神说逆置链表的方法都不控件复杂度为O(1)的方法,因为有一个先决条件,就是输入的条件应该是只读的,逆置链表则进行了写操作。

It is a common misunderstanding that the space complexity of a program is just how much the size of additional memory space being used besides input. An important prerequisite is neglected the above definition: the input has to be read-only. By definition, changing the input and change it back is not allowed (or the input size should be counted when doing so). Another way of determining the space complexity of a program is to simply look at how much space it has written to. Reversing a singly linked list requires writing to O(n) memory space, thus the space complexities for all "reverse-the-list"-based approaches are O(n), not O(1).

Solving this problem in O(1) space is theoretically impossible due to two simple facts: (1) a program using O(1) space is computationally equivalent to a finite automata, or a regular expression checker; (2) the pumping lemma states that the set of palindrome strings does not form a regular set.

Please change the incorrect problem statement.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值